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

为什么以下代码给我一个错误(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;
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...