2011-01-19 16 views
1

VS2005からC++ Builder XEにコードを移植して、両方のコンパイラでコンパイルします。次のコードはVS2005の下でうまくコンパイルされますが、C++ Builderではインライン関数rawtime()で件名エラーメッセージが表示されます。E2321宣言でタグまたは識別子が指定されていません

(E2321宣言はタグまたは識別子を指定しません)。

template<typename counter_type> 
class synchronizer 
{ 
private: 
// PRIVATE TYPES 

typedef timer<counter_type>      timer_type; 
typedef reference_point<counter_type>   reference_point_type; 
typedef time_data<counter_type>     time_data; 
typedef typename timer_type::time_stamp_type time_stamp_type; 
typedef typename timer_type::time_span_type  time_span_type; 
typedef typename filetime_counter::value_type time_type; 
typedef typename counter_type::value_type  counter_value_type; 
typedef synchronizer<counter_type>    this_type; 

/* some code removed for sake of this post */ 

public: 

typedef counter_type counter_type; 
typedef typename counter_type::value_type raw_value_type; 
TIMESTATS_STMT(typedef statistics<counter_type> statistics_type); 

inline raw_value_type rawtime() const /* Subject ERROR coming from this line */ 
{ 
    return m_timer.now().value(); 
} 

私は特に問題はなく、これを解決し、このポストの結果、次の試み:ここ

コードです。 template class operator overloading problem

思考/コミット?

--- EDIT:TIMESTATS_STMTを示唆

フィードバックので、ここでエラーのacutal原因であることが定義されている方法です。 TIME_ENABLE_STATISTICSは、VS2005とC++ Builder XEの両方でコメント化されています。

// #define TIME_ENABLE_STATISTICS 
// 

// 
// Make null definitions 
// 
#define TIMESTATS_VAR(var, type, initial) 
#define TIMESTATS_STMT(stmt) 

#ifdef TIME_ENABLE_STATISTICS 

// 
// Make real definitions 
// 
#undef TIMESTATS_VAR 
#define TIMESTATS_VAR(var, type, initial) type var = initial 
#undef TIMESTATS_STMT 
#define TIMESTATS_STMT(stmt) stmt 

--- EDIT

問題のある行はTIMESTATS_STMTラインのように見えるん。私は次のようにNULL #defineを定義しないことで訂正することができました。

#ifdef TIME_ENABLE_STATISTICS 
    TIMESTATS_STMT(typedef statistics<counter_type> statistics_type); 
#endif 

答えて

1

TIMESTATS_STMTが、それは言うのは難しいのですが、私は、問題は実際にマクロ展開の行に発生し、私には罰金見える次の行にタグ付けされている賭けに展開するもの知らず。

+0

Thanks Mark、更新された記事を参照してくださいどのようにTIMESTATS_STMTが定義されています。私はTIMESTATS_STMT行をコメントアウトしてみましたが、(もちろん)どこにエラーがあるのでしょうか。 – Eric

1

間違っ:TIMESTATS_STMT(typedef statistics<counter_type> statistics_type);

正しい:TIMESTATS_STMT(typedef statistics<counter_type> statistics_type)

マクロの後にセミコロンを削除します。マクロは強力な言語拡張ですが、時には非常に危険で予測できないこともあります。

私はC++マクロを使うのが好きですが、悪いです。

+0

修正:Cマクロです。 C++を非難する必要はありません。 ; p – leetNightshade

関連する問題