#include <string>
using namespace std;
struct C
{
operator const char *(){return “”;}
operator string(){return “”;}
};
int main()
{
string str;
const char *cstr;
C c;
c==cstr;//OK
c==str;// 编译报错
}
///c==str 为什么没有隐式转化呢?莫非是string有什么限制吗?
using namespace std;
struct C
{
operator const char *(){return “”;}
operator string(){return “”;}
};
int main()
{
string str;
const char *cstr;
C c;
c==cstr;//OK
c==str;// 编译报错
}
///c==str 为什么没有隐式转化呢?莫非是string有什么限制吗?
解决方案
5
2
原因是 string 已经重载了 operator ==
string的 operator == 匹配失败后,
并不进行先, 隐式转换为string,
再跟 operator == 匹配 了
假如是 == 则可以先转换
string的 operator == 匹配失败后,
并不进行先, 隐式转换为string,
再跟 operator == 匹配 了
假如是 == 则可以先转换
7
对于表达式
c==str
编译器会查找
1. c.operator=(str)
2. operator=(c, str)
3. 语言内建运算符,例如 bool operator==(cosnt char *, const char*)
对于右边 const char * 的情况,匹配到第三类, c 被转换到 const char *
对于右边是 string 的情况,第一类是没有的,第二类和第三类找不到合适的
第三类没有合适的原因楼上都说了,string 不能直接转换为 const char *
第二类没有合适的原因是,和 string 相关的几个 operator== 都是模板,要使用这些运算符重载必须进行模板函数特化,这时必须将模板参数全部推断出来。但表达式 c 的类型为 C ,并不能从中推导出模板需要的参数,此时模板参数推导失败,该模板不列入备选。
几个相关的模板如下:
// C 不是 const basic_string<chart, traits, Allocator> ,也不是其子类 template<class charT, class traits, class Allocator> bool operator==(const basic_string<charT,traits,Allocator>& lhs, const basic_string<charT,traits,Allocator>& rhs) noexcept; // C 不是 const CharT* template<class charT, class traits, class Allocator> bool operator==(const charT* lhs, const basic_string<charT,traits,Allocator>& rhs);
6
原因是string的==重载是模板重载,模板参数推断无法使const basic_string<CharT,Traits,Alloc>&匹配C(http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp)。
加一个string的特例化==重载就可以了:bool operator == (const string &, const string &) { … }
加一个string的特例化==重载就可以了:bool operator == (const string &, const string &) { … }