我目前正在将C ++应用程序移植到受限制的环境中。该应用程序使用STL,字符串和流类。我正在重写这些在我的环境中可以很好地运行的简化版本。
我担心的是,即使没有所有必要的操作员定义,我的应用程序也在编译。例如,对于我定义的字符串类:
string operator+ (const string& lhs, const string& rhs);
这就足够了。但是,我注意到通常情况下有mystring +“一些常量字符串”,这在我的代码中没有定义。当我明确添加它时,它被使用:
string operator+ (const string& lhs, const char* rhs);
之前发生了什么?它在我添加第二个函数之前成功编译。当然,编译器无法推断如何将c样式字符串连接到我的字符串类。
我现在在我的程序中遇到了奇怪的行为,我想知道是否由于其他操作符未定义。如果程序需要,有没有办法强制编译器要求这样的运算符定义?
P.S。我的字符串类位于一个唯一的命名空间中,与std ::
无关答案 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::string
或char*
。
在类声明中查找转换构造函数或转换运算符。
class MyString
{
MyString(char*);
MyString(std::string);
operator std::string ();
operator char*();
};
这些将被隐式调用。
您可以为构造函数指定explicit
关键字,以防止这种情况发生。
如果这不能解决问题,那么必须让运算符在某处重载,最好找到他们使用调试器逐步执行代码。