2012-10-19 173 views
1

我必須聲明Itertypename,但不是typedef
然後,我不能在我的templateclass聲明中使用Iter =>沮喪:(
請告訴我如何使用Iter,否則解釋我爲什麼C++是如此nasty ...模板類嵌套類型typename

template <typename T> 
struct MyContainer 
{ 
    typedef std::vector<T> Vec; 
    typename Vec::iterator Iter; 

    void Fo (typename std::vector<T>::iterator); //ok 
    typename std::vector<T>::iterator Ba();  //ok 

    void Foo (Iter); //error: 'Iter' is not a type 
    Iter Bar();  //error: 'Iter' does not name a type 
};     //(gcc 4.1.2) 
  1. 爲什麼typedef不能用來聲明Iter?爲什麼不呢?
  2. 如何內templateclass使用Iter?(例如,作爲函數參數類型)

EDIT
在指令typename Vec::iterator Iter;關鍵字typenameVec::iterator是一種類型(即不是靜態成員函數/屬性)。因此,Iter未聲明爲類型,而是作爲使用Vec::iterator類型的變量聲明。

回答

7
  1. typedef可以和typename一起使用。因此,它變成了:

    typedef typename vec::iterator Iter; 
    
  2. 只需使用Iter現在。

    template <typename T> 
    struct MyContainer 
    { 
        typedef std::vector<T>   Vec; 
        typedef typename Vec::iterator Iter; 
    
        void Foo (Iter); //ok 
        Iter Bar();  //ok 
    }; 
    
+0

完美:)我剛纔在你的答案代碼源解決方案:-D感謝加;) – olibre

+1

@olibre關於您的編輯這個答案(我回滾了):可以在枚舉中通過縮進兩次使用blockquote(4 + 4 = 8個空格)。不需要任何不尋常的枚舉語法... – jogojapan

+1

@jogojapan謝謝您的提示/建議:-D – olibre

1

只需添加到以前的答案...

typename Vec::iterator Iter; 

是一個有效的C++聲明,聲明不是一個類型,但一個名爲Iter變量。

引入了關鍵字typename來指定後面的標識符是一個類型。解析Vec::iterator時,編譯器無法識別iterator表示類型,因爲它是取決於模板的名稱。它可以是Vec中的靜態數據成員。

Officially, what is typename for?

+0

是的,'typename'和'typedef'分別聲明*變量名*和*變量類型*,不是嗎? – olibre

+1

@olibre:你不太對。我爲答案添加了一個解釋。 – Andrey

+0

+1謝謝您的提示:'iterator'可能是屬性或函數... – olibre

0

這條線:

typename Vec::iterator Iter; 

聲明稱爲Iter一個成員變量,Vec::iterator類型(即vector<T>::iterator)的,而不是一種類型。

看着你在這之後,你可能是指做了什麼:

typedef typename Vec::iterator Iter;