今天同学在看C++模板类时候,碰见了一个很棘手的问题,先帖代码吧...
//test1.cpp 代码1
#include
using namespace std;
template
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
using namespace std;
template
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)
的模板类,当编译时,编译器无法确定程序中调用的是那个模板类,产生的二义性....
就这么个蛋疼的程序,折腾了我们整整一晚上,于是得出的经验是,编译错误一定要好好看,哪怕英语再菜...写程序时尽量避开一下简单的关键字,出了问题,很难发现原因~~~
阅读(1449) | 评论(1) | 转发(0) |