第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 中文版》(人民邮电出版社)
所有原文和书上范例都来自于此