c – 具有typedef返回值的模板成员函数
发布时间:2020-12-16 05:28:46 所属栏目:百科 来源:网络整理
导读:为什么以下代码给我一个错误(g 4.1.2)? templateclass Aclass Foo {public: typedef std::vectorA AVec; AVec* foo();};templateclass AFooA::AVec* FooA::foo() { // error on this line return NULL;} 错误是: error: expected constructor,destructor,o
为什么以下代码给我一个错误(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()函数否则(具有正确的返回类型)? 解决方法
这是一个叫“
two-stage lookup”的问题.基本上,由于A是foo()定义中的模板参数,所以编译器首次无法知道解析模板,无论Foo A :: AVec是一个类型还是存在(因为例如,则可能存在不包含typedef的Foo>专业化).它只会知道模板实例化过程中会发生什么,这在后期发生 – 现在为时已晚.
正确的方法是使用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; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |