【c++】typename關鍵字的使用

1.定義模板類型參數

在c++模板中有兩種定義方法:

template<class T>...

template<typename T>...

這兩種定義方式有什麼區別呢?

相信學習C++的人對class這個關鍵字都非常明白,class用於定義類,在模板引入c++後,

最初定義模板的方法爲: template<class T>...... 
在這裏class關鍵字表明T是一個類型,後來爲了避免class在這兩個地方的使用可能給人帶來混淆,所以引入了typename這個關鍵字,它的作用同class一樣表明後面的符號爲一個類型,這樣在定義模板的時候就可以使用下面的方式了: template<typename
T>......
因此在模板定義語法中關鍵字class與typename的作用完全一樣

 2.聲明一個類型  

typename的另外一個作用:使用嵌套依賴類型(nested depended name)

template<typename T>
class CLink
{
public:
	CLink()
	{
		phead = new Node();
	}
	void insertHead(T data)
	{
		Node* pnewnode = new Node(data);
		pnewnode->pnext = phead->pnext;
		phead->pnext = pnewnode;
	}
	void Show()
	{
		Node* pCur = phead->pnext;
		while (pCur != NULL)
		{
			std::cout << pCur->mdata << " ";
			pCur = pCur->pnext;
		}
		std::cout << std::endl;
	}
	~CLink()
	{
		Node* pCur = phead;
		Node* pNext = pCur;
		while (pCur != NULL)
		{
			pNext = pCur->pnext;
			delete pCur;
			pCur = pNext;
		}
		phead = NULL;
	}
	class Node;
	Node* find(T val);
private:
	class Node
	{
	public:
		Node(T val = T())
			:mdata(val), pnext(NULL)
		{}
	public:
		T mdata;
		Node* pnext;
	};
	Node* phead;
};
template<typename T>
typename CLink<T>::Node* CLink<T>::find(T val)
{
	for (Node* pCur = phead->pnext; pCur != NULL; pCur = pCur->pnext)
	{
		if (pCur->mdata == val)
		{
			return pCur;
		}
	}
	return NULL;
}

int main()
{
	CLink<int> cl;
	for (int i = 0; i < 10; i++)
	{
		cl.insertHead(i + 1);
	}
	cl.Show();
	auto rt = cl.find(5);
	return 0;
}

 在上面這段代碼中typename CLink<T>::Node* CLink<T>::find(T val)  這個函數的返回值是CLink<T>::Node* CLink<T>,所以這裏的typename的作用就是告訴編譯器,typename後面的字符串是一個類型,而不是成員變量或是成員函數。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章