2012-03-14 206 views
6
struct Messages 
{ 
     template <typename V> 
     static const char* message() {return "test mesage";} 
}; 

template <int Min, class M=Messages> 
struct Test: public M 
{ 
    Test() 
    { 
     M::message<int>(); //error: expected primary-expression before 'int' 
    } 
}; 

int main() 
{ 
    Test<5, Messages> t; 
} 

衍生我懷疑這跟一些相互依存,就像測試的代碼取決於基M級,其方法是內部專業模板類的模板方法測試。它是否正確?爲什麼我不能調用從

回答

7

M::message是從屬名稱,因爲M是模板參數。編譯器無法知道一個從屬名稱本身就是一個模板,因此,你需要明確指定這一點:

M::template message<int>(); 

否則編譯器解析的代碼,就好像M::message是一個值,該值以下尖括號不同的含義(即它們被解析爲小於和大於運算符,而不是作爲模板列表分隔符)。編譯器無法從這種錯誤的解析中恢復。

+0

謝謝,就是這樣。我不知道使用'template'關鍵字來消除依賴名稱的歧義。 – 2012-03-14 15:54:06

相關問題