成員函式模板,顯示例項化、宣告
阿新 • • 發佈:2020-12-15
技術標籤: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中已經有該模板的例項化類了
模板的例項化定義只有一個,宣告可以由多個。