2013-10-10 153 views
0

任何人都可以解釋爲什麼我不能夠使用C++模板是這樣的:編譯錯誤使用C++模板

template <typename T> class A { 
public: 
    typedef std::vector<T>::iterator myiterator; 

    A(T value) 
     : v(10, value) 
    { 
    } 

    myiterator begin() 
    { 
     return v.begin(); 
    } 

    myiterator end() 
    { 
     return v.end(); 
    } 

public: 
    std::vector<T> v; 
}; 

int main() 
{ 
    A<int> a(10); 

    for (auto i = a.begin(); i != a.end(); ++i) 
     std::cout << *i << std::endl; 

    return 0; 
} 

我在哪裏myiterator別名聲明行編譯錯誤;錯誤是:「失蹤」;「在標識符「myiterator」之前「。

回答

4

變化

typedef std::vector<T>::iterator myiterator; 

typedef typename std::vector<T>::iterator myiterator; 

既然你是通過模板類型(矢量)訪問類型,您需要幫助編譯器來消除歧義。 vector<T>::iterator可以是靜態成員,也可以是類型。沒有更多的T知識,編譯器就無法確定。使用typename關鍵字會告訴編譯器「將其視爲一種類型」。

有關詳細信息,請參閱Where and why do I have to put the "template" and "typename" keywords?

+0

是的,這個工程!但爲什麼'typedef'在這裏還不夠?爲什麼我應該指定額外的typename關鍵字? –

+1

C++是一個複雜的怪物,這就是爲什麼;)任何時候你想訪問一個依賴於模板參數的類型,你需要'typename'。 – bstamour

2

編譯器應該知道std::vector是一種類型,它是依賴範圍:

typedef typename std::vector<T>::iterator myiterator; 
1

我得到有用的錯誤消息:

'std::vector<T>::iterator' : dependent name is not a type 
      prefix with 'typename' to indicate a type 

您需要告訴它你正在申報一個類型:

typedef typename std::vector<T>::iterator myiterator; 
//  ^^^^^^^^