2011-01-19 50 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

想法/ Commnets?

---編輯:

反饋暗示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 

---編輯

出錯行確實出現了TIMESTATS_STMT線。我能夠通過取消定義NULL #define來進行更正,如下所示。

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

回答

1

不知道什麼TIMESTATS_STMT展開,這是很難說,但我敢打賭,實際上發生在宏展開的線的問題,並正在標記到下面的行,這似乎沒什麼問題。

+0

感謝Mark,查看TIMESTATS_STMT如何定義的更新後。我嘗試評論TIMESTATS_STMT行,並在其他地方(當然)發現了大量錯誤。 – Eric 2011-01-19 15:09:55

1

錯誤:TIMESTATS_STMT(typedef statistics<counter_type> statistics_type);

正確:TIMESTATS_STMT(typedef statistics<counter_type> statistics_type)

宏命令後刪除分號。宏是一種強大的語言擴展,但有時非常非常危險且不可預測。

我喜歡使用C++宏,但它們是邪惡的。

+0

更正:它們是C宏。你不必爲這些指責C++。 ,p – leetNightshade 2013-08-18 03:18:37