操作符的中缀调用,函数查找过程是怎么样的啊.为什么这样的代码出错呢?

R9R9R9 2006-10-30 03:37:49
书上看到说,中缀操作符中的左边参数的类的作用域与全局作用域都被考虑到重载解析范围内.

class X
{
public:
void operator %(float rx) //2
{
cout<<"X:%"<<endl;
}
};

void operator %(const X &lx, int rx) //1
{
cout<<"std:%"<<endl;
}


int main(char**, char**)
{

X x;
x % 2; //为什么这里不懂去调用函数1呢?操作符的中缀调用,函数查找过程是怎么样的啊.是先查找类X中的operator %函数呢.还是先寻找最佳可匹配函数啊?
system("pause");
return 0;
}
...全文
208 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
R9R9R9 2006-10-30
  • 打赏
  • 举报
回复
...给分,结贴!!!谢谢各位捧场
weijiangshanwww 2006-10-30
  • 打赏
  • 举报
回复
呵呵,路过,支持路上的说法!
pongba 2006-10-30
  • 打赏
  • 举报
回复
比较复杂,实际上这类重载决议包含三个候选集:内建的、成员的、自由的。三个候选集出来了之后就会进行一般意义上的重载决议。重载决议的过程一般描述是这样:如果存在一个重载版本,它的所有参数对实参的匹配都不比别人差,同时至少有一个参数匹配得比别人好,那么这个就会被选中。
你的例子实际上应该是ambiguous的,不信你拿到comeau online test上看看。成员的那个版本:
X::operator%(float) <transformed into> operator%(X&,float);
与自由的版本:
operator%(const X&,int)
做比较。
成员版本的第一个参数比自由版本的第一个参数能更佳的匹配*this,因为x是non-const的。但自由版本的第二个参数又比成员版本匹配得更好,所以... 无法决议。

鉴于X::operator %应该是不会修改this的状态的,所以你可以把它声明为const成员函数:
operator%(float) const
{...}
这样决议就会选中自由版本。
R9R9R9 2006-10-30
  • 打赏
  • 举报
回复
不是吧...我在vc.net 2003与dev c++上编译x%2这条语句都是出现错误的:

vc7.1:
c:\documents and settings\administrator\桌面\dev cpp\oo\oo.cpp(28): error C2666: “X::operator`%'” : 2 个重载有相似的转换

dev c++:
C:\Documents and Settings\Administrator\×ÀÃæ\dev cpp\oo\oo.cpp ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second:
Jokar 2006-10-30
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

class X
{
public:
void operator %(float rx) //2
{
cout<<"X:%"<<endl;
}
};

void operator %(const X &lx, int rx) //1
{
cout<<"std:%"<<endl;
}


int main(char**, char**)
{

X x;
x%2;
x.operator %(2);
system("pause");
return 0;
}

输出:
std:%
X:%
请按任意键继续. . .


platfrom:VC6.0

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧