没有操作符定义的c++失败
C++ Fail without Operator Definition
我目前正在将一个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::string
或char*
,除非您指定如何。
在类声明中查找转换构造函数或强制转换操作符
class MyString
{
MyString(char*);
MyString(std::string);
operator std::string ();
operator char*();
};
这些将隐式调用。
您可以为构造函数指定explicit
关键字来防止这种情况发生。
如果这不能解决问题,则必须在某个地方重载操作符,最好使用调试器逐步查找它们。
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- variadic模板中的模板参数推导失败