调用重载的operator =(bool)而不是operator =(string)

时间:2018-04-06 18:37:23

标签: xcode c++11 operator-overloading

我创建了一个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;

enter image description here

我找到的解决方法&#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)

1 个答案:

答案 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*boolchar const[12]std::string更好的转换原因是前者是一系列标准转换,而后者涉及用户定义的转换。

要允许在赋值中使用字符串文字,请添加另一个重载。

JSONObject& operator=(char const*);

PS 您应该将所有operator=函数的返回值更改为JSONObject&,以使其成为惯用语。有关详细信息,请参阅What are the basic rules and idioms for operator overloading?