C++ “错误”;期望表达式“;在这个模板代码中

C++ “错误”;期望表达式“;在这个模板代码中,c++,templates,C++,Templates,为什么会出现此错误以及如何修复它 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 } }; 模板 结构f

为什么会出现此错误以及如何修复它

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
  }
};
模板
结构foo{
模板
void hello(){}
};
模板
结构条{
虚空世界(){
福福;
f、 hello();//错误:应为表达式
}
};

您需要使用
模板
消歧器,这样编译器就会知道它应该将
hello
解析为模板成员函数的名称,随后的
解析为界定模板参数的尖括号:

f.template hello<0>();
//^^^^^^^^
f.template hello();
//^^^^^^^^

Ok,这似乎可行,但为什么需要这样做?为什么C++不只是像以前那样理解它?那里只有一个hello成员模板函数…@7cows:嗯,当解析模板时(因此在您实际使用一个特定的
T
实例化模板之前),编译器不知道
foo
的定义是什么样子的。它可以有一个名为
hello
的数据成员,类型为(比如)int(在这种情况下,
f.hello…
可以是
(f.hello<0)>…
),或者一个名为
hello
的成员函数,具体取决于
T
@7cows:是的,有一个
hello
模板,但是
foo
可能专门用于某些
T
,并且专门的
foo
的定义可能看起来与主模板完全不同(例如,它可能具有
hello
类型
int
的数据成员,而不是
hello
成员函数TemplateWing。谢谢