成員函數模板,顯式實例化、聲明

009成員函數模板與模板顯式實例化

#include<iostream>
#include<cstdlib>
#include<string>
#include<vector>

using namespace std;


class A
{
public:
	template <typename T>
	void myFunction09(T tem)//成員變量函數模板
	{
		cout << tem << endl;
	}
	
};


//類本身具有模板參數C,成員函數具有模板參數T1,T2
template <typename T3>
class B
{
public:
	template <typename T>
	void myFunction09(T tem)//成員變量函數模板
	{
		cout << tem << endl;
	}


	//構造函數模板
	template <typename T2>
	B(T2 v1, T2 v2);
	
	void mytestFunction09()
	{
		cout << "這是B類的測試函數" << endl;
	}
	
public:
	T3 c1;
};

//構造函數
template <typename T3>//先寫類的模板參數列表
template<typename  T2>//在寫函數自己的模板參數列表
B<T3>::B(T2 v1, T2 v2)
{
	cout << v1 << endl;
	cout << v2 << endl;
}

//函數模板
template <typename T4>
void myFunction009(T4 t)
{

	cout << t << endl;
}



/*(3)
1.顯式實例化  --實例化定義,只需要在一個.cpp只不過定義就可以,
編譯器一遇到這個定義就實例化一個具體的類

2.在其他.cpp文件中“顯式實例化聲明”
extern template B<double>;		--模板實例化聲明,不會在本文件中生成一個實例化代碼,在其他cpp文件中已經有一個實例化版本了
但是其他版本的實例化可以存在其他cpp文件中,如int float double類型等
總結:一個cpp中定義,其他cpp中都是聲明。
*
 */


//顯式實例化類模板
template B<double>;

//顯式實例化函數模板
template void myFunction009(int t);



int main(void)
{
	//(1)
	A a;
	//調用的時候,編譯器纔會實例化模板
	a.myFunction09(3);//編譯器自動推斷--int
	a.myFunction09<double>(3.2343);

	//(2)
	//類模板參數必須<>來指定,函數模板參數很多時候可以推斷出來
	B<double> b1(2, 3);//構造函數模板類型自動推斷int


	//(3)模板顯式實例化
	

	system("pause");
	return 0;
}

/*
*(1)普通類的成員函數模板
*不管是普通類,還是類模板,它的成員函數都可以是一個函數模板,稱爲“成員函數模板”。不可以是虛函數。
*
*(2)類模板的成員函數
*類模板的函數(類模板函數+普通成員函數)只有被調用的時候纔會實例化。如果函數從未使用,則不會實例化該成員函數。
*
*(3)模板顯式實例化
*每個cpp都是獨立編譯的。
*同時爲了防止多個.cpp中都實例化了相同的類模板,所以c++提供了一個解決辦法。
*這時候就需要顯式實例化。
*
*總結:
*1。這個特色編譯器實現不不好,不建議使用,認識即可。
*
* Sunrise於東北電力大學第二教學樓1121實驗室
* 2019年11月24日22:28:05
*
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章