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。谢谢