Chinaunix首页 | 论坛 | 博客
  • 博客访问: 46323
  • 博文数量: 8
  • 博客积分: 516
  • 博客等级: 下士
  • 技术积分: 105
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-16 22:09
文章分类
文章存档

2010年(8)

分类: C/C++

2010-11-04 22:27:12

   今天同学在看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) |
给主人留下些什么吧!~~

chinaunix网友2010-11-05 14:45:27

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com