2013-05-12 81 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