typename的用法

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可以讓編譯器把它修飾的變量解釋爲一個類型,而不是一個函數。

 

 

發佈了37 篇原創文章 · 獲贊 16 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章