我创建了一个lib来使用XCode解析JSON内容,主类JSONObject
重载了operator=
,如您所见:
class JSONObject
{
//...
public:
JSONObject();
~JSONObject();
//...
void operator=(int);
void operator=(long);
void operator=(float);
void operator=(double);
void operator=(bool);
void operator=(std::string);
//...
};
此处的问题是,在使用时operator=(string)
调用了operator=(bool)
:
JSONObject nItem;
nItem = "My New Item"; // <--- Here is what the problem is founded.
innerObj["GlossSeeAlso"]+= nItem;
我找到的解决方法&#34;修复&#34;这个问题是指定字符串类型:
nItem = (string)"My New Item"; //"Fix 1"
nItem = string("My New Item"); //"Fix 2"
lib和示例编译为:
Apple LLVM version 8.0.0 (clang-800.0.38)
可以创建完整的代码here。
感谢您解决此问题的任何帮助,为什么调用operator=(bool)
而不是operator=(string)
。
答案 0 :(得分:2)
字符串文字"My New Item"
的类型为char const[12]
。需要将此类型转换为重载operator=
函数支持的类型之一。
由于各种转换规则,编译器正确地决定了这一点
char const[12]
→char const*
→bool
转化效果优于char const[12]
→std::string
。因此,operator=(bool)
被调用。 char const[12]
→char const*
→bool
比char const[12]
→std::string
更好的转换原因是前者是一系列标准转换,而后者涉及用户定义的转换。
要允许在赋值中使用字符串文字,请添加另一个重载。
JSONObject& operator=(char const*);
PS 您应该将所有operator=
函数的返回值更改为JSONObject&
,以使其成为惯用语。有关详细信息,请参阅What are the basic rules and idioms for operator overloading?。