繁体   English   中英

具有typedef返回值的模板化成员函数

[英]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()函数(使用正确的返回类型)?

这是一个称为“ 两阶段查找 ”的问题。 基本上,由于Afoo()定义中的模板参数,编译器无法知道何时第一次解析模板, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM