我有一些在VC9(Microsoft Visual C++ 2008)中編譯好的模板代碼,但不能在GCC 4.2(在Mac上)編譯。我想知道是否有一些我錯過的語法魔法。調用模板化內部類靜態成員函數的C++語法?
下面我有一個精簡的例子,它演示了我的錯誤。對不起,如果這個例子似乎毫無意義,我儘可能地去除這個錯誤。
特別是我有一個模板類S,它有一個內部類R也是一個模板類。從頂級模板函數foo,我試圖調用[R ::追加其爲R的靜態成員函數:
template< typename C >
struct S {
template< typename T >
S<C> & append(const T &) { return *this; }
template< int B >
struct R {
template< typename N >
static S<C> & append(S<C> & s, const N) {
return s.append(42);
}
};
};
template< typename C >
S<C> & foo(S<C> & s, const int n) {
S<C>::R<16>::append(s, n); // error: '::append' has not been declared
return s;
}
任何人在那裏知道我做錯了嗎?
+1,我想知道這是Visual Studio中的錯誤還是gcc中的錯誤。 – 2010-01-19 07:57:13
顯然這是Visual C++的一個非標準「特性」。 C++規範指出在這種情況下需要消歧。 VC讓你跳過它。我不知道是否有一個編譯器開關讓VC更嚴格地執行規範合規性? – jwfearn 2010-01-21 01:45:22