在前兩節中(C++模板詳解(一)、C++模板詳解(二)),我們了解了函式模板和類模板的基本概念和使用方法,在這篇博文里,我們主要來詳細地闡述一下"模板的引數宣告"這個話題,并且也談及了函式模板和類模板相結合的使用方式和一些注意事項,
一、函式模板作為普通類和模板類的成員函式
函式模板可以作為普通類和模板類的成員函式,下面的這份代碼片段演示了這一點:
template<typename T1>
class List
{
public:
// 位于模板類中的成員函式模板定義:
template<typename T2>
List(const List<T2>& other);
// 錯誤的寫法:不可以是虛函式,
template<typename T1>
virtual void func(T1&& t)
{
}
};
// #1: 在類的外部定義上面的建構式,
template<typename T1>
template<typename T2>
List<T1>::List(const List<T2>& other)
{
//...
}
class Collection
{
// 位于普通類內部的成員函式模板定義:
template<typename T>
T* alloc()
{
//...
}
// 錯誤的寫法:不可以是虛函式,
template<typename T>
virtual void func(T&& t)
{
}
};
這份代碼展示出了很多的概念,
-
無論是普通類還是模板類,其中的成員函式或是模板成員函式都可以行內地定義在類中,或是定義在類的外部,在外部定義的成員函式模板可以具有多個模板引數子句:一個子句作用于該模板自身,其它子句作用于外圍的類模板,其順序是從最外圍的類模板開始,依次到達內部模板,
-
成員函式模板不可以是虛函式,這是因為,實作虛函式需要使用一個固定大小的虛函式表,每個虛函式都對應虛函式表的一個入口,然而,成員函式模板的實體化個數,要等到整個程式都編譯完成時才能確定,這就和"虛函式表的大小是固定的"發生了沖突,所以,成員函式模板不可以是虛函式,
二、模板類可以被嵌套定義在普通類或者模板類中
模板類的定義也是可以嵌套的,例如下面這份示例代碼:
// 示例1:模板類可以被嵌套定義在模板類中,
template<typename T1>
class List
{
// 定義并實作,
template<typename T2>
class Node1
{
};
// 定義,
template<typename T2>
class Node2;
};
// 外部實作,
template<typename T1>
template<typename T2>
class List<T1>::Node2
{
};
// 示例2:模板類可以被嵌套定義在普通類中
class Shell
{
// 定義并實作,
template<typename T>
class Inner1
{
};
// 定義,
template<typename T>
class Inner2;
};
// 外部實作,
template<typename T>
class Shell::Inner2
{
};
類似于成員函式的類外實作,內部類的具體實作也同樣可以被放到類外進行,它們的書寫規則和模板成員函式幾乎相同,
三、函式模板宣告中的默認引數
函式模板同樣可以在宣告中提供預設引數:
template<typename T>
void report(const Stack<T>& stack, int number = 10);
template<typename T>
void fill(const Array<T>& arr, const T& value = https://www.cnblogs.com/rosefinch/p/T());
由于和普通函式的預設引數功能相似,具體的注意事項可以直接參看:C++函式詳解,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/64985.html
標籤:C++
下一篇:開源虛擬機Bochs安裝以及踩坑
