2010-05-15 56 views
7

为什么此代码无效?C++模板:'不是从类型派生的'

#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' 

有什么不对?如何解决它?

回答

14

在这一行,你缺少的typename关键字:

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

您需要:

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

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

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