首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于friend的有关问题

2012-03-21 
关于friend的问题?我自己写了一个MyString类来模仿string类,当中遇到一个奇怪的问题,我想写一个operator+

关于friend的问题?
我自己写了一个MyString   类   来模仿   string   类,当中遇到一个奇怪的问题,我想写一个operator+操作和operator < <操作   ,两者都在类外定义:
MyString&   operator   +(   const   MyString&   str1,   const   MyString&   str2   )
ostream&   operator < <(   ostream&   os,   const   MyString&   str   )

在类中我把他们声明为友元函数
friend   MyString&   operator   +(   const   MyString&   str1,   const   MyString&   str2   )
friend   ostream&   operator < <(   ostream&   os,   const   MyString&   str   )

但是这样编译有问题  
error   C2593:   'operator   + '   is   ambiguous
error   C2593:   'operator   < < '   is   ambiguous
error   C2593:   'operator   + '   is   ambiguous

说的是ambiguous(暧昧),我不知道这是为什么会有暧昧关系
请高手指教啊,多谢!

[解决办法]
编译器对操作符函数的决议,不同于对其它成员函数的决议,它会参阅到当前可见的所有同名操作符函数,无论是成员函数或是友员的外部函数以及可见的全局函数。
(见《C++ Common Knowledge》条款26- "操作符函数的查找 "-page70)

例如如下程序:

class PShow
{
long l;
public:
PShow(const long& _l= 0): l(_l){}
PShow operator+(const long& _l)//重载的操作符成员函数!
{
l = _l;
return *this;
}

friend PShow operator+(PShow _ps,const long& _l);
};

PShow operator+(PShow _ps,const long& _l)//位于全局作用域的重载操作符友员函数!
{
_ps.l += _l;
return _ps;
}

int _tmain(int argc, _TCHAR* argv[])
{
PShow _pp;
_pp = _pp + 8;//调用点生成 "error C2593: “operator +”不明确! "

_PAUSE;
return 0;
}

在VC编译器上对上述程序的编译将生成 ": error C2593: “operator +”不明确! "!!!!
但你去掉其中任一个重载操作符函数(如去掉友员,则应在类中去掉友员声明。),程序将通过编译运行良好!

因此,你的问题和friend没有关糸,而是因为在编译单元当前可见的文件中,为重载运算符定义了多个可能的运算符,导至编译器无法决议调用点的函数名。

热点排行