隐式构造函数未被识别

时间:2014-11-03 21:47:27

标签: c++ implicit-conversion

我试图弄清楚编译器为什么不推断它应该使用Obj的字符串构造函数。

这种情况不应该启用隐式构造吗? (我传递const引用字符串和const引用Obj) 不是隐含建构的整个想法吗?我在这里失踪了什么?

class Obj
{
public:
    Obj(const std::string& str)
    {

    }

    void operator+=(const Obj& other)
    {
        cout << "operator+=" << endl;
    }

    Obj& operator++()
    {
        operator +=("something"); // error
        return *this;
    }
};

我用gcc 4.8.2编译, 谢谢!

2 个答案:

答案 0 :(得分:3)

从字符串文字"something"Obj的转换需要两个用户定义的转换:一个从字符串文字到std::string,另一个使用您的构造函数从std::stringObj。隐式转换序列仅限于包含一个用户定义的转换。

解决此问题的最佳方法是添加另一个带有C字符串的构造函数,

Obj(const char* str)

如果您不想添加此类构造函数并且只想执行一次此转换,则可以:

  1. operator+=(std::string("something"))(明确执行第一次转换)
  2. (C ++ 14)写operator+=("something"s),使用新的用户定义的文字后缀s构建std::string

答案 1 :(得分:2)

不允许多个用户定义的转化。您有两个,char*std::stringstd::stringObj。您可以通过将std::string传递到operator+=

来解决此问题
Obj& operator++()
{
    operator +=(std::string("something"));
    return *this;
}

或者,您可以添加一个带有const char*

的隐式构造函数
Obj(const char* str)