2012-12-05 54 views
1

我讀的是如何在C++ typename關鍵字使用這種很好的總結:http://pages.cs.wisc.edu/~driscoll/typename.html的typedef資格依賴性類型

不過我想知道一個具體的例子:

template<typename T> class Outer{ 
    public: 
    class Inner1{ 
     T t; 
    }; 
    class Inner2{ 
     int t; 
    }; 
}; 

template<typename T> void foobar(void) 
{ 
    std::list<Outer<T>::Inner1> l; 
} 

從上面我明白鏈接的文本我需要

std::list<typename Outer<T>::Inner1> l; 

因爲Inner1既合格又相關。

但是:Inner2也需要一個令我困惑的類型名稱: 首先,它似乎很清楚Inner2是一種類型(好吧,Inner1已經清楚了)。其次,Inner2根本不依賴T.對於所有可能的Ts,Inner2將是相同的(類型)!

當我在模板中使用限定類型時,是否需要typedef?是否依賴於模板參數?

+1

'對於所有可能的TS,Inner2將是相同的(類型)' - 不,考慮類模板特! –

回答

1

Outer<T>::Inner2確實取決於類型T,因爲編譯器不知道Inner2是什麼類型的東西 - 無論是類型還是例如一個靜態數據成員。所以,是的,你需要告訴編譯器這是什麼樣的事情,因爲默認是假設它是非類型成員(例如靜態數據成員,方法名稱,enum值),因此在這裏使用typename

(這是真正的C++ 03 - 我假設的規則上這並沒有改變中的C++ 11)

+1

C++ 11也一樣。 – Nawaz

3

你的第二個假設是錯誤的。 Inner2 does依賴於T,因爲每個外部都有另一個Inner2。如果你擅長外變得清晰:

template<> class Outer<char>{ 
public: 
    class Inner1{ 
    T t; 
    }; 
    typedef int Inner2; 
}; 

而且,即使你不擅長,Outer<float>::Inner2Outer<long>::Inner2可能具有相同的佈局,會員,名稱等,但它們不是同一類型!考慮訪問 - Outer<long>::Inner2已經訪問Outer<long>的私有成員,Outer<float>::Inner2沒有。

在下面的專業化Inner2甚至不是一個類型:

template<> class Outer<long double>{ 
public: 
    char Inner2(int); 
}; 
+0

的確,我沒有考慮專業化!非常感謝! – user1878401