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
由于编译器可以通过具体的实参类型来实例化模板参数IT,所以可以省略对其的显式的实例化:
int a = Max
当有多个模板参数时只能省略参数列表后面的几个,这一点和普通函数的默认实参的规则是类似的。
另外一个例子,来自《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
当然,还可以强制类型转换:
int a = Min(ui, (unsigned)1); 或者 int a = Min(
晚饭吃的炸酱面,一大碗,没吃饱,又要了一小碗。面做的一点都不好吃,怎奈这几天食欲大振,就像现在的天气一样~ 写这篇日志时,CCTV5直播男篮亚锦赛,CHN VS. TPE,易建联软软的扣了一个篮,解说杨毅:阿联经过这段时间的锻炼,钢筋铁骨啊!
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Be the first to comment on this entry.