2012-11-11 124 views
4

我試圖找出爲什麼一些代碼,我將無法編譯,我做了還原一個公平位的匿名用這個例子來結束:調用模板方法

#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打開的代碼是一個內存分配,可能不應該處於熱循環中。

回答

3

在你打電話

return ap->amem<b>(); 

名稱amem是一個從屬名稱上下文:如果這樣的野獸的確是指一個成員函數模板,你需要通過添加關鍵字template說出這樣的話:

return ap->template amem<b>(); 

順便提一句,請注意,你不得定義NULL!如果您需要定義您應該包含的憎惡內容,例如cstddef。最好使用0nullptr當使用C++ 2011.

+0

感謝您的回答。我從來沒有在實際的代碼中定義NULL,但我在這裏做了讓自己包含儘可能的例子。 –