MOOC清华《面向对象程序设计》第4章:函数模板实验

#include <iostream>
using namespace std;

template <typename T>
T sum(T a, T b){
	return a + b;
}

int main(){
	int a = 3, b = 4;
	cout << "sum(int, int) = " << sum(a, b) << endl;
	float f1 = 1.3, f2 = 9.1;
	cout << "sum(float, float) = " << sum(f1, f2) << endl;
	return 0;
}


函数模板设置默认值的实验:

#include <iostream>
using namespace std;

template <typename T0 = float,
		typename T1,
		typename T2 = float,
		typename T3,
		typename T4>
T0 func(T1 v1, T2 v2, T3 v3, T4 v4){
	cout << "func() is called" << endl;
	return 0.1;
}

int main(){
	//func(1, 2, 3);//ERROR:no matching function for call to 'func(int, int, int)'
	func(1, 2, 3, 4); 
	//func('a', 'b', "cde");//ERROR:no matching function for call to 'func(char, char, const char [4])'
	func('a', 'b', "cde", 'f');
	return 0;
}


我惊奇地发现:学堂在线上徐明星老师讲错了!我电脑上的Dev C++并没有通过main函数中注释掉的那两行代码!而是报了错:没有匹配相应参数个数的函数。但是如果实参个数与形参个数相匹配(相同),即使T2被设置成了默认float,却依然能通过全是int和全是char/string型的实参的编译!

实践出真知!这说明什么?说明徐老师讲的也许是C++的标准,但就像汽车尾气排放标准一样,标准是在那里放着,但并不是所有车型都实现了欧III欧IV,最终还是要以厂家实际的产品特性为准。汽车产品的实际排放特性是由汽车厂家决定的,编译器实际支持的语言特性是由编译器开发者决定的。在Dev C++ 5.11中,并不支持函数参数的缺省。


即使把T2 v2放到函数形参列表的最后面,也不能通过编译:

#include <iostream>
using namespace std;

template <typename T0 = float,
		typename T1,
		typename T2 = float,
		typename T3,
		typename T4>
T0 func(T1 v1, T3 v3, T4 v4, T2 v2){
	cout << "func() is called" << endl;
	return 0.1;
}

int main(){
	//func(1, 2, 3);//ERROR:no matching function for call to 'func(int, int, int)'
	func(1, 2, 3, 4); 
	//func('a', 'b', "cde");//ERROR:no matching function for call to 'func(char, char, const char [4])'
	func('a', 'b', "cde", 'f');
	return 0;
}

报错信息与之前一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值