C++-g++error:expectedprimary-expression
⼀ 举例
#include <iostream>
class Demo {
public:
template<typename T>
void f(T&& t) {
std::cout << "Demo:f " << std::endl;
}
};
template <typename T>
class Demo_T {
error parse newpublic:
void f(T* t) {
t->f<int>(1);
}
};
int main() {
Demo_T<Demo> dt;
Demo d;
dt.f(&d);
std::();
return 0;
}
⼆ 关键字typename template
整理stackoverflow上的⼀个回答。
1 什么是名称查(name lookup)
C++ Standard at (3/7):
Some names denote types or templates. In general, whenever a name is encountered it is necessary to determine whether that name denotes one of these entities before continuing to parse the program that contains it. The process that determines this is called name lookup.
某些名称表⽰类型或模板。通常,只要遇到名称就需要在继续解析包含它的程序前确定该名称是否表⽰这些实体之⼀。确定的过程叫做名称查。
2 什么是依赖名称(dependent name)
针对 t::x,如果t是⼀个模板类型参数,x可以是⼀个静态整型数据成员,也可以是⼀个嵌套类或者能够进⾏声明的typedef,如果名称具有在实际模板参数已知前⽆法查的属性,就被称为依赖名称。
3 在依赖名称前使⽤typename
C++ Standard at (14.6/2):
A name used in a template declaration or definition and that is dependent on a template-parameter is assumed not to
name a type unless the applicable name lookup finds a type name or the name is qualified by the keyword typename.
在模板声明或者定义中使⽤的名称和依赖于模板参数的名称,假设它们不会⽤来命名类型,除⾮适⽤的名称查到⽤typename关键字限定的类型名称或名称。也就是说
We decide how the compiler should parse this. If it is a dependent name, then we need to prefix it by typename to tell the compiler to parse it in a certain way.
我们决定编译器如何解析它,如果是⼀个依赖名称,我们需要在其前⾯加上typename关键字。
4 关键字template
对名称来说,模板也有类似的问题。
例如
boost::function< int() > f;
⼈可能会⽐较好理解。boost::function是⼀个模板,但是编译器理解会⽐较困难。例如对于下⾯代码来说:
namespace boost { int function = 0; }
int main() {
int f = 0;
boost::function< int() > f;
}
该表达式也是有效的(先判断⼩于,再判断⼤于)。所以不如告诉编译器这是⼀个模板,即在前⾯加上关键字template,例如
t::template f<int>(); // call a function template
注意template可以出现的位置:
Template names can not only occur after a :: but also after a -> or . in a class member access. You need to insert the keyword there too:
this->template f<int>(); // call a function template
三 参考
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论