C++ Template 實踐草稿(two)

第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);*/
};
兩個Value

void 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 中文版》(人民郵電出版社)

所有原文和書上範例都來自於此




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章