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