关于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没有关糸,而是因为在编译单元当前可见的文件中,为重载运算符定义了多个可能的运算符,导至编译器无法决议调用点的函数名。