[英]Templated member function with typedef return value
为什么以下代码会给我一个错误(g ++ 4.1.2)?
template<class A>
class Foo {
public:
typedef std::vector<A> AVec;
AVec* foo();
};
template<class A>
Foo<A>::AVec* Foo<A>::foo() { // error on this line
return NULL;
}
错误是:
error: expected constructor, destructor, or type conversion before '*' token
我应该如何定义Foo<A>::foo()
函数(使用正确的返回类型)?
这是一个称为“ 两阶段查找 ”的问题。 基本上,由于A
是foo()
定义中的模板参数,编译器无法知道何时第一次解析模板, Foo<A>::AVec
是一种类型还是存在(例如,因为,可能存在Foo<Bar>
,它根本不包含typedef。 它只会在模板实例化过程中知道它是什么,后者发生在这个阶段 - 这对于这个阶段来说已经太晚了。
正确的方法是使用typename
关键字来指示这是一个类型:
template<class A>
class Foo {
public:
typedef std::vector<A> AVec;
AVec* foo();
};
template<class A>
typename Foo<A>::AVec* Foo<A>::foo() {
return NULL;
}
通常的typename
问题:
template<class A>
typename Foo<A>::AVec* Foo<A>::foo() { // error on this line
return NULL;
}
请记住:作为一般规则,依赖于模板参数的所有限定名称都需要在它们之前使用typename
。
我真的不知道,但尝试将typedef放在课堂之外。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.