typename的用法
很多人都會以爲typename和class的作用是一樣的,事實不然,typename還有另外一個用途:將某個帶作用域的標識符顯式地
說明爲類型,這在類型之間具有依賴關係的情況下是經常要用到的。不好理解,先看個例子再說:
#include <iostream> using namespace std; template <class T> class TypeClass { public: typedef T Integer; }; template <class T> class TestClass { public: //T::Integer i; typename T::Integer i; //爲什麼一定要加typename? TestClass():i(6){} }; int main() { typedef TypeClass<int> IntegerType; typedef TestClass<IntegerType> UseInteger; UseInteger ui; cout<<ui.i<<endl; typedef TypeClass<double> DoubleType; typedef TestClass<DoubleType> UseDouble; UseDouble ud; cout<<ud.i<<endl; return 0; }
看上面的例子,在類模板TestClass中,T::Integet必須是一個類型,變量纔有類型。此時類型Integet是依賴於類型T的。而我們也確實把一個類模板TypeClass作爲參數傳遞給力TestClass,此時TestClass中的T就是一個TypeClass<int>,應該可以把
Integer解釋爲一個類型。但是,事實並不是這樣,只有在類型T被實例化的時候,才能知道Integer是否爲一個類型(因爲Integer
既可以解釋爲一個成員變量,也可以解釋爲一個成員函數)。C++在默認的情況下,並不將依賴於別的類而存在的標識符認定爲
類型,所以如果把typename T::Integer i中前面的typename去掉,就是發生編譯錯誤。
總而言之,typename可以讓編譯器把它修飾的變量解釋爲一個類型,而不是一個函數。