没有操作员定义的C ++失败

时间:2011-10-20 19:10:25

标签: c++ string g++ operator-overloading concatenation

我目前正在将C ++应用程序移植到受限制的环境中。该应用程序使用STL,字符串和流类。我正在重写这些在我的环境中可以很好地运行的简化版本。

我担心的是,即使没有所有必要的操作员定义,我的应用程序也在编译。例如,对于我定义的字符串类:

string operator+ (const string& lhs, const string& rhs);

这就足够了。但是,我注意到通常情况下有mystring +“一些常量字符串”,这在我的代码中没有定义。当我明确添加它时,它被使用:

string operator+ (const string& lhs, const char* rhs);

之前发生了什么?它在我添加第二个函数之前成功编译。当然,编译器无法推断如何将c样式字符串连接到我的字符串类。

我现在在我的程序中遇到了奇怪的行为,我想知道是否由于其他操作符未定义。如果程序需要,有没有办法强制编译器要求这样的运算符定义?

P.S。我的字符串类位于一个唯一的命名空间中,与std ::

无关

5 个答案:

答案 0 :(得分:12)

如果没有看到其余的代码,就不可能确定,但​​在这种情况下,猜测也许并不难。你几乎肯定有string的构造函数,它以char const *作为参数,所以发生的事情是编译器正在使用该ctor将char const *转换为string然后使用string operator+ (const string& lhs, const string& rhs);连接它。

允许这种情况发生是(如果不是 )使用全局变量而不是成员函数重载这些运算符的主要原因之一。作为成员函数,他们可以转换操作数,但不能转换为左。

答案 1 :(得分:2)

当您传递const char*时,可能构造了一个字符串对象并传递给operator +。如果您在调试器中单步执行代码,则可能能够验证是否正在调用构造函数。

答案 2 :(得分:2)

你可能在你的类中有一个构造函数,它以const char *作为输入参数。很可能这个构造函数用于隐式覆盖和你看到的奇怪行为。

声明将const char *作为explicit的构造函数,这将禁止将其用于不打算使用它的隐式转换。

答案 3 :(得分:2)

你的'string'类是否有一个带有const char *的参数构造函数?该单个参数构造函数是否标记为“显式”?

如果不明确,最可能的答案是编译器通过转换构造函数从char *构造临时字符串对象,然后使用该临时字符串调用您的两个参数加法运算符。

答案 4 :(得分:1)

除非您指定方式,否则编译器无法知道如何将字符串转换为std::stringchar*

在类声明中查找转换构造函数或转换运算符。

class MyString
{
    MyString(char*);
    MyString(std::string);

    operator std::string ();
    operator char*();
};

这些将被隐式调用。

您可以为构造函数指定explicit关键字,以防止这种情况发生。

如果这不能解决问题,那么必须让运算符在某处重载,最好找到他们使用调试器逐步执行代码。