2013-05-12 69 views
4

爲什麼會出現此錯誤,我該如何解決?此模板代碼中的「預期表達式」錯誤

template<typename T> 
struct foo { 
    template<size_t N> 
    void hello() {} 
}; 

template<typename T> 
struct bar { 
    void world() { 
    foo<T> f; 
    f.hello<0>(); //Error: Expected expression 
    } 
}; 

回答

12

您需要使用template消歧,所以編譯器會知道它應解析hello作爲模板成員函數的名稱,以及隨後<>爲尖括號劃定模板參數:

f.template hello<0>(); 
//^^^^^^^^ 
+0

好吧,似乎工作,但爲什麼這需要?爲什麼C++不像以前那樣理解它?在這裏只有一個hello成員模板函數... – 7cows 2013-05-12 15:13:04

+2

@ 7cows:那麼,在解析模板時(所以*之前*您實際上是用一個特定的'T'實例化模板),編譯器不知道定義'foo '真的很像。它可能有一個名爲'hello'的數據成員(比如說)'int'(在這種情況下'f.hello <0> ...'可能是'(f.hello < 0) > ...'),或者是一個被調用的成員函數'hello',具體取決於'T'。 – 2013-05-12 15:17:40

+2

@ 7cows:是的,有一個'hello'模板,但'foo'可能專用於某些'T',並且專用的'foo'的定義可能看起來完全不同於主模板(例如,它可以有''int'類型的'hello'數據成員而不是'hello'成員函數模板 – 2013-05-12 15:18:59