當我有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>)時,它編譯時沒有錯誤。
那麼這裏有什麼問題?
真棒。但是歧義在哪裏?template關鍵字是否只指定了func是一個模板還是它是一個模板成員函數?即使我告訴編譯器它是一個模板,編譯器仍然不知道它是成員還是函數。 (也許這從語法上是清楚的) –
@AndreasH。你不能有模板成員變量,所以從語法上可以清楚看到。麻煩的是''<' and '>'令牌,這些令牌在C++中嚴重超載。 – TartanLlama