为什么下面的代码给我一个错误(g ++ 4.1.2)?带有typedef返回值的模板成员函数
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()
功能?
您的解决方案是正确的,但我不太确定解释。只要编译器达到'Foo :: foo',它将返回并“修复”返回类型。如果它没有这样做,它将不符合'foo'(在类中)与定义的声明(即它会警告返回类型不同)。这与您的链接中的“两阶段”查找无关。 – 2009-05-27 17:59:25
我相信我错在了两阶段的查找链接中。正确的解释是 - 当查找嵌套的依赖名称(依赖未知模板参数,即Foo :: Bar)时,它被假定为不是类型。唯一的例外是在基类列表中。 至于编译器修复返回类型 - 否,模板实例化发生得更晚;编译器在代码 – ASk 2009-05-28 00:00:06