1. 程式人生 > 其它 >成員函式模板,顯示例項化、宣告

成員函式模板,顯示例項化、宣告

技術標籤:C++

一、普通類的成員函式模板
不管是普通類還是模板類,它的成員函式可以是一個函式模板,稱為“成員函式模板”,不可以是虛擬函式,否則編譯器會報錯。

#include <iostream>

using namespace std;

class A
{
public:
	template <typename T>
	void myft(T temp)//成員函式模板
	{
		cout << temp << endl;
	}
};


int main()
{
	A a;
	a.myft();
	return 0;
}
3

二、類模板的成員函式模板

類模板的模板引數必須用<>指定,成員函式模板(普通函式模板)的引數都可以由系統推斷

#include <iostream>

using namespace std;

template<typename C>//類模板
class A
{
public:
	template<typename T2>
	A(T2 v1, T2 v2);//建構函式我們也引入自己的模板,和整個類的模板c沒有關係

	template <typename T>
	void myft(T temp)//成員函式模板
	{
		cout << temp <<
endl; } void myftpt() { } C m_ic; }; template <typename C>//先跟類模板的引數列表 template <typename T2>//再跟建構函式自己的模板引數列表 A<C>::A(T2 v1, T2 v2) { cout << v1 << v2 << endl; } int main() { A<float>a(1, 2); A<float>a2(1.1, 2.2);//編譯器執行到上一句會例項化,同一種例項不會例項兩次,這裡類似再次呼叫例項
return 0; }
12
1.12.2

類模板的成員函式(包括普通成員函式/成員函式模板)只有為程式所用的(程式碼中出現了)才會例項化,如果某函式未使用,則不會例項化該成員函式。

三、模板顯示例項化,模板宣告
為了防止在多個.cpp檔案中都例項化相同的類模板,所以C++11提出了一個解決方法,我們成為“顯示例項化”;通過”顯示例項化“類對這種生成多個相同類模板例項的開銷
test.cpp

//"顯示例項化"手段中"例項化定義",這種例項化定義只需要在一個.cpp檔案就可以。
template A<float>;//編譯器遇到這段程式碼就直接例項化一個A<float>類
//在其它test.cpp中只需宣告就行

test2.cpp

extern template A<float>;//其它宣告都這麼寫
//extern目的就是告訴編譯器在其它.cpp中已經有該模板的例項化類了

模板的例項化定義只有一個,宣告可以由多個。