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 中文版》(人民邮电出版社)

所有原文和书上范例都来自于此




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值