2010-05-15 60 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