我試圖找出爲什麼一些代碼,我將無法編譯,我做了還原一個公平位的匿名用這個例子來結束:調用模板方法
#define NULL ((void*)0)
template<typename T>
class a {
public:
template<bool b>
T * amem() {
return NULL;
}
};
template<typename T>
class b {
public:
a<T>* ap;
template <bool b>
T * m() {
return ap->amem<b>();
}
};
int main()
{
return 0;
}
根據我使用的編譯器和變量名稱,我得到不同的錯誤。他們都圍繞着這一行,雖然:
return ap->amem<b>();
編譯使用鐺++ [蘋果鐺版本4.0(標籤/蘋果/鐺 - 421.0.57)(基於LLVM 3.1svn),我得到以下信息:
tmp.cpp:18:26: error: expected expression
return ap->amem<b>();
^
1 error generated.
編譯使用克++ [i686的-蘋果darwin11-LLVM-G ++ - 4.2(GCC)4.2.1]時,得到以下信息:
tmp.cpp: In member function ‘T* b<T>::m()’:
tmp.cpp:18: error: expected primary-expression before ‘>’ token
tmp.cpp:18: error: expected primary-expression before ‘)’ token
令人不解(我,反正)。如果我將amem的名稱更改爲m,則不再從g ++中獲得任何錯誤,但是從clang ++中獲得相同的錯誤。
我確定這裏有些東西我只是不明白?有誰知道clang和gcc在尋找什麼表達方式?有誰知道如何解決這個問題?
如果這是一個編譯器錯誤(似乎令人懷疑),有沒有人知道任何解決方法,不涉及到使用bool參數(而不是模板)將amem轉換爲函數?我已經這樣做了,我可以證實這個問題可以解決這個問題,但這是在一個熱循環中,而由b打開的代碼是一個內存分配,可能不應該處於熱循環中。
瘋狂。我不知道模板的使用。我多次使用它,但從來沒有用於功能。 –