请教:关于操作符重载,隐藏与隐式转换的困惑
有个问题有点疑惑,请教下大家:
且看一下以下这段代码
#include <string>class CMyString : public std::string{public: CMyString (); /*explicit */CMyString (const char *pszStr); [0] /*explicit */CMyString (std::string str); [0] ~CMyString(void); CMyString operator += (const CMyString &rStr); CMyString operator + (const CMyString &rStr);};CMyString::CMyString(){}CMyString::CMyString( const char *pszStr ){}CMyString::CMyString( std::string str ){}CMyString::~CMyString( void ){}CMyString CMyString::operator+=( const CMyString &rStr ){}CMyString CMyString::operator+( const CMyString &rStr ){}int main(int argc, char* argv[]){ CMyString myStr; char szTest[] = "test"; myStr += szTest; // [1]ok CMyString* pStr = &myStr; pStr->operator + (szTest); // [2]ok 隐藏? myStr + szTest; // [3] error// error C2666: 'CMyString::operator +' : 2 overloads have similar conversions// could be 'CMyString CMyString::operator +(const CMyString &)'// or 'std::basic_string<_Elem,_Traits,_Ax> std::operator +<char,std::char_traits<char>,std::allocator<_Ty>>(const std::basic_string<_Elem,_Traits,_Ax> &,const char *)' [found using argument-dependent lookup]// with// [// _Elem=char,// _Traits=std::char_traits<char>,// _Ax=std::allocator<char>,// _Ty=char// ]// while trying to match the argument list '(CMyString, char [5])' return 0;}#include <iostream>#include <cstdlib>using namespace std;class X{public: X(int xx):x(xx){} int x;};class Y{public: Y(X xx):y(xx.x){} int y;};void f(Y){}int main(){//======case 1====== X x(2); f(x); //ok f(X(2));//ok//======case 2====== f(2); //error:conversion from `int' to non-scalar type `Y' requested system("PAUSE"); return 0;}