没有操作符定义的c++失败

C++ Fail without Operator Definition

本文关键字:c++ 失败 定义 操作符      更新时间:2023-10-16

我目前正在将一个c++应用程序移植到一个稍微受限制的环境中。该应用程序使用STL、字符串和流类。我正在重写它们的简化版本,以便在我的环境中很好地运行。

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

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

,这就足够了。然而,我注意到经常有mystring +"一些常量字符串"的情况,而这在我的代码中没有任何定义。当我显式地添加它时,它被使用:

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

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

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

注:我的字符串类在一个唯一的命名空间中,与std::

无关。

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

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

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

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

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

你的'string'类有一个带const char*的单参数构造函数吗?单参数构造函数标记为"显式"吗?

如果不是显式的,最可能的答案是编译器通过转换构造函数从char*构造一个临时字符串对象,然后使用该临时字符串调用双参数加法操作符。

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

在类声明中查找转换构造函数或强制转换操作符

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

这些将隐式调用。

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

如果这不能解决问题,则必须在某个地方重载操作符,最好使用调试器逐步查找它们。