C++中typedef和模板能否同時使用

1、程序的處理的步驟

步驟

所進行的內容

生成的文件

預處理

展開頭文件/宏替換/去掉註釋/條件編譯

.i”文件

編譯

檢查語法,生成彙編

.s”文件

彙編

彙編代碼轉換機器碼

.o”目標文件

鏈接

鏈接到一起生成可執行程序

.out”或“.exe”可執行文件

  • define:預處理期間處理,實際上所有的帶#的都是在預處理期間處理的。
  • typedef:編譯期間處理。
  • template:模板的實例化類型確定是在編譯期間,模板實例化只會實例化用到的部分,沒有用到的部分將不會被實例化。

例1:

#include <iostream>
#include <set>

using namespace std;

template<class T>
class A
{
public:
	A() {}
	~A() {}
	void add(T &t) {
		key.insert(t);
	}
	void display() {
		for(auto &var : key) {
			cout << var << " ";
		}
		cout << endl;
	}

protected:
	typedef set<T> mySet;

private:
	mySet key;
};

int main()
{
	//A<int> a;
	//for (int i = 0; i < 5; i++) {
	//	a.add(i);
	//}
	//a.display();	
system("pause");
	return 0;
}

出:

       可以看出以上程序編譯通過併成功運行,因爲typedef定義類型轉變的時候必須是已經定義的類型,而template<class T>可以看作是對T做了定義,故可直接使用。

例2:

修改例1代碼:

#include <iostream>
#include <set>

using namespace std;

typedef set<T> mySet;		// 錯誤

template<class T>
class A
{
public:
	A() {}
	~A() {}
	void add(T &t) {
		key.insert(t);
	}
	void display() {
		for(auto &var : key) {
			cout << var << " ";
		}
		cout << endl;
	}

private:
	mySet key;
};

int main()
{
	A<int> a;
	for (int i = 0; i < 5; i++) {
		a.add(i);
	}
	a.display();

	system("pause");
	return 0;
}

       以上代碼編譯出錯,出錯原因爲“未定義標識符T”。因爲typedef在類外,首先運行該typedef語句,而T是未定義類型,故而出錯。因此在C++中判斷typedef和模板能否同時使用關鍵是要判斷兩者的前後定義順序。

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