调用显式专用类成员模板函数时出现奇怪的编译错误

时间:2016-09-09 07:52:37

标签: c++ templates compiler-errors

我在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;)实例化测试时,它会编译而不会出错。

那么这里有什么问题?

2 个答案:

答案 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>()