2016-09-09 23 views
1

當我有GCC 5.1.0(tdm64-1)一個奇怪的編譯錯誤編譯如下代碼奇怪的編譯錯誤調用來明確專門的類成員模板函數

template <class T> 
struct test { 
    template <class X> 
    bool func(); 
}; 

template <class X, class Y> 
bool testfunc(X x, Y y) 
{ 
    test<Y> s; 

    if (s.func<X>()) // <-- parse error here 
     return false; 
} 

void func2() 
{ 
testfunc(double(), long()); 
} 

的錯誤是

testX.cpp: In function 'bool testfunc(X, Y)': 
testX.cpp:12:15: error: expected primary-expression before '>' token 
    if (s.func<X>()) 
      ^
testX.cpp:12:17: error: expected primary-expression before ')' token 
    if (s.func<X>()) 

請注意,當Y是模板參數時,錯誤僅出現在版本中。當我刪除Y模板參數並使用已知類型實例化測試(例如,測試< int>)時,它編譯時沒有錯誤。

那麼這裏有什麼問題?

回答

4

更改此:

if (s.func<X>()) 

要這樣:

if (s.template func<X>()) 

原因是s.func<X>是一個從屬名稱,因此編譯器不能告訴func是一個模板成員函數。

3

由於s.func<X>()是一個從屬名稱,你需要告訴編譯器func是一個模板,使用template關鍵字:

s.template func<X>() 
+0

真棒。但是歧義在哪裏?template關鍵字是否只指定了func是一個模板還是它是一個模板成員函數?即使我告訴編譯器它是一個模板,編譯器仍然不知道它是成員還是函數。 (也許這從語法上是清楚的) –

+1

@AndreasH。你不能有模板成員變量,所以從語法上可以清楚看到。麻煩的是''<' and '>'令牌,這些令牌在C++中嚴重超載。 – TartanLlama

相關問題