1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
template <class T, class IT>
T Max(IT beg, IT end)
{
    //~ 且不管这个函数是怎么实现的
}
 
int main()
{
	vector<int> ivec;
	//~ ... push_back some elements into the vector
	int a = Max(ivec.begin(), ivec.end()); //~ 编译器在这里报错
	return 0;
}

编译器会提示: ‘T Max(IT,IT)’ : could not deduce template argument for ‘T’。意思就是无法”推演”出模板参数T的具体类型,以至于无法实例化模板函数Max。解决方法就是显式特例化模板参数:
int a = Max::iterator>(ivec.begin(), ivec.end());
由于编译器可以通过具体的实参类型来实例化模板参数IT,所以可以省略对其的显式的实例化:
int a = Max(ivec.begin(), ivec.end());
当有多个模板参数时只能省略参数列表后面的几个,这一点和普通函数的默认实参的规则是类似的。

另外一个例子,来自《C++ Primer》,

1
2
3
4
5
6
7
8
9
10
11
12
template <class T>
T Min(T x, T y)
{
	return x < y ? x : y;
}
 
int main()
{
	unsigned ui = 0;
	int a = Min(ui, 1);
	return 0;
}

这几行代码又有哪些错误呢?cl.exe提示说,error C2782: ‘T Min(T,T)’ : template parameter ‘T’ is ambiguous。在参数类型的确定上产生了不确定性,这是为什么呢?好吧,1会被解释成是int型的,但是我们平时不是经常把int直接传给unsigned类型的参数吗?可惜的是,此时的Min还不是一个函数,它只是一个模板而已,实例化之前尚不能完成参数的隐式转化(其实,我认为这只是编译器支持与否的问题)。同样,可以用显式特例化的方法来解决:
int a = Min(ui, 1); 或者 int a = Min(ui, 1);
当然,还可以强制类型转换:
int a = Min(ui, (unsigned)1); 或者 int a = Min(ui, 1);

晚饭吃的炸酱面,一大碗,没吃饱,又要了一小碗。面做的一点都不好吃,怎奈这几天食欲大振,就像现在的天气一样~ 写这篇日志时,CCTV5直播男篮亚锦赛,CHN VS. TPE,易建联软软的扣了一个篮,解说杨毅:阿联经过这段时间的锻炼,钢筋铁骨啊!

Tags: ,.
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Home

Be the first to comment on this entry.

Name(required)
Mail (required),(will not be published)

RFC: Request For Comments. Orz..

Website(recommended)