我在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模板参数并使用已知类型(例如test&lt; int&gt;)实例化测试时,它会编译而不会出错。
那么这里有什么问题?
答案 0 :(得分:4)
改变这个:
if (s.func<X>())
对此:
if (s.template func<X>())
原因是s.func<X>
是一个从属名称,因此编译器无法判断func
是模板成员函数。
答案 1 :(得分:3)
由于s.func<X>()
是一个从属名称,您需要使用template
关键字告诉编译器func
是一个模板:
s.template func<X>()