C ++模板:'不是从类型'派生的'

时间:2010-05-15 21:07:13

标签: c++ templates compilation

为什么这段代码无效?

#include <vector>

template <typename T>
class A {
  public:
    A() { v.clear(); }

    std::vector<A<T> *>::const_iterator begin() {
      return v.begin();
    }

  private:
    std::vector<A<T> *> v;
};

GCC报告以下错误:

test.cpp:8: error: type 'std::vector<A<T>*, std::allocator<A<T>*> >' is not derived from type 'A<T>'
test.cpp:8: error: expected ';' before 'begin'
test.cpp:12: error: expected `;' before 'private'

有什么问题?如何解决?

2 个答案:

答案 0 :(得分:14)

在这一行中,您遗漏了typename关键字:

std::vector<A<T> *>::const_iterator begin(){

你需要:

typename std::vector<A<T> *>::const_iterator begin(){

这是因为std::vector<A<T> *>依赖于类模板(T)的模板参数(A)。为了能够正确解析模板而不必对任何其他模板的可能特化做出任何假设,语言规则要求您使用typename关键字指示哪些从属名称表示类型。

答案 1 :(得分:3)

你需要添加typename作为彼此依赖的类型,编译器无法弄清楚它是否真的是一个类型。

但是,在gcc 4.5.0上我得到一个更简洁的错误信息:

test.cc:8:3: error: need ‘typename’ before ‘std::vector<A<T>*>::const_iterator’ because ‘std::vector<A<T>*>’ is a dependent scope