第8章,p93
“和普通函數一樣,函數模版聲明也可以使用具有缺省調用實參
。。。(一個聲明)
template <typename T>
void fill (Array<T>*, T const& = T() );//對於基本類型T()爲0
後一個聲明說明了:缺省調用實參可以依賴於模版參數。顯然,當fill()函數被調用時,如果提供了第2個函數調用參數的話,就不會實例化這個缺省實參。這同時說明了:即使不能基於特定類型T來實例化缺省調用實參,也可能不會出現錯誤”
對原文中的同時說明不太理解,看代碼
template <typename T>
class Array
{
public:
T array[10];
};
template <typename T>
void fill(Array<T> *, T const& = T())
{
cout << "fill函數執行" << endl;
}
定義Array和fill(偷懶不寫了)
class Value
{
public:
int left, right;
Value(int l, int r){
cout << "構造函數" << endl;
left = l;
right = r;
}
~Value(){
cout << "析構函數" << endl;
}
};
class Value2
{
public:
/*Value2(int);*/
};
兩個Valuevoid init(Array<Value> *array)
{
Value zero(0, 0);
Value2 zero2;
//fill(array, zero);
//fill(array, zero2);
//fill(array);
}
首先先使用Value
int main()
{
Array<Value> *array = NULL;
init(array);
system("pause");
return 0;
}
init代碼改爲
void init(Array<Value> *array)
{
Value zero(0, 0);
Value2 zero2;
fill(array, zero);
//fill(array, zero2);
fill(array);
}
有一個錯誤
而把使用默認值的fill註釋掉
void init(Array<Value> *array)
{
Value zero(0, 0);
Value2 zero2;
fill(array, zero);
//fill(array, zero2);
//fill(array);
}
通過
說明當定義完整構造函數,提供了第2個函數調用參數的話通過,而採用默認值的時候由於沒有默認構造函數將導致一個錯誤。
下面將Value改爲Value2
Value2代碼
class Value2
{
public:
/*Value2(int);*/
};
init代碼
void init(Array<Value2> *array)
{
Value zero(0, 0);
Value2 zero2;
//fill(array, zero);
fill(array, zero2);
fill(array);
}
這時有個小插曲,執行結果居然與上一個相同,意味着fill()調用的是zero,而不是zero2
當我們將zero也註釋掉,恢復正常
結論:當定義了構造函數時缺省的模版參數將無法通過
學習的書籍爲《C++ Templates 中文版》(人民郵電出版社)
所有原文和書上範例都來自於此