C++中,关于模板类的一个小小的误解
时间:2010-11-04 来源:lgj8514752
今天同学在看C++模板类时候,碰见了一个很棘手的问题,先帖代码吧...
//test1.cpp 代码1
#include <iostream>
using namespace std;
template <typename T1, typename T2> T1 max(T1 aa, T1 bb, T2 cc) { if(aa > bb) { aa = bb; } return aa; }
int main() { int a = 0, b = 0; double d = 1.0;
max(a,b,d); }
同学总是说这个代码总是提示一下错误 test1.cpp: In function ‘int main()’: test1.cpp:20: error: call of overloaded ‘max(int&, int&, double&)’ is ambiguous test1.cpp:6: note: candidates are: T1 max(T1, T1, T2) [with T1 = int, T2 = double] /usr/include/c++/4.4/bits/stl_algobase.h:253: note: const _Tp& std::max(const _Tp&, const _Tp&, _Compare) [with _Tp = int, _Compare = double]
扎眼一看感觉很奇怪很奇怪,根本找不出什么错误,于是乎开始猜测是不是T1 a,T2 b两个形参在读取数据是产生了二义性,等等等等,整了整整一晚上...也没个头绪
然后怀着疑问,偶敲了以下的代码却编译通过了,代码如下:
//test2.cpp 代码2 #include <iostream>
using namespace std;
template<typename t1, typename t2> t1 fun(t1 aa, t1 bb, t2 cc) { if(aa > bb) aa = bb; return aa; }
int main() { int a = 0,b = 0; double d = 1.0; fun(a,b,d); }
于是,很疑惑很疑惑的讨论了半天,然后重新看编译提示错误时,发现其实,上述错误只是个狠碰巧的错误罢了,错误提示的是test1.cpp:20: error: call of overloaded ‘max(int&, int&, double&)’ is ambiguous test1.cpp:6: note: candidates are: T1 max(T1, T1, T2) [with T1 = int, T2 = double] /usr/include/c++/4.4/bits/stl_algobase.h:253: note: const _Tp& std::max(const _Tp&, const _Tp&, _Compare) [with _Tp = int, _Compare = double] 即,在C++库中,已经定义了一个 template<_Tp&,_Compare> std::max(const _Tp&, const _Tp&, _Compare) 的模板类,当编译时,编译器无法确定程序中调用的是那个模板类,产生的二义性....
就这么个蛋疼的程序,折腾了我们整整一晚上,于是得出的经验是,编译错误一定要好好看,哪怕英语再菜...写程序时尽量避开一下简单的关键字,出了问题,很难发现原因~~~
using namespace std;
template <typename T1, typename T2> T1 max(T1 aa, T1 bb, T2 cc) { if(aa > bb) { aa = bb; } return aa; }
int main() { int a = 0, b = 0; double d = 1.0;
max(a,b,d); }
同学总是说这个代码总是提示一下错误 test1.cpp: In function ‘int main()’: test1.cpp:20: error: call of overloaded ‘max(int&, int&, double&)’ is ambiguous test1.cpp:6: note: candidates are: T1 max(T1, T1, T2) [with T1 = int, T2 = double] /usr/include/c++/4.4/bits/stl_algobase.h:253: note: const _Tp& std::max(const _Tp&, const _Tp&, _Compare) [with _Tp = int, _Compare = double]
扎眼一看感觉很奇怪很奇怪,根本找不出什么错误,于是乎开始猜测是不是T1 a,T2 b两个形参在读取数据是产生了二义性,等等等等,整了整整一晚上...也没个头绪
然后怀着疑问,偶敲了以下的代码却编译通过了,代码如下:
//test2.cpp 代码2 #include <iostream>
using namespace std;
template<typename t1, typename t2> t1 fun(t1 aa, t1 bb, t2 cc) { if(aa > bb) aa = bb; return aa; }
int main() { int a = 0,b = 0; double d = 1.0; fun(a,b,d); }
于是,很疑惑很疑惑的讨论了半天,然后重新看编译提示错误时,发现其实,上述错误只是个狠碰巧的错误罢了,错误提示的是test1.cpp:20: error: call of overloaded ‘max(int&, int&, double&)’ is ambiguous test1.cpp:6: note: candidates are: T1 max(T1, T1, T2) [with T1 = int, T2 = double] /usr/include/c++/4.4/bits/stl_algobase.h:253: note: const _Tp& std::max(const _Tp&, const _Tp&, _Compare) [with _Tp = int, _Compare = double] 即,在C++库中,已经定义了一个 template<_Tp&,_Compare> std::max(const _Tp&, const _Tp&, _Compare) 的模板类,当编译时,编译器无法确定程序中调用的是那个模板类,产生的二义性....
就这么个蛋疼的程序,折腾了我们整整一晚上,于是得出的经验是,编译错误一定要好好看,哪怕英语再菜...写程序时尽量避开一下简单的关键字,出了问题,很难发现原因~~~
相关阅读 更多 +