C++中重载+运算符后const char与自定义struct t相加的VS2015编译错误解决
解决
const char[] + t的运算符重载问题 你的问题核心出在运算符重载的方向限制上:你定义的是t类的成员operator+,它只能处理**左操作数是t对象、右操作数是const char***的场景(比如y + "abc"),但反过来const char[] + t(也就是你写的"\r\n" + y)完全不兼容——C++不会自动把左操作数的const char[]转换成t对象来匹配你的成员运算符,而且原生的const char[]本身也没有和t类型相加的内置运算符。
要解决这个问题,你需要额外定义一个全局的非成员运算符函数,专门处理左操作数是const char*、右操作数是t对象的情况:
#include <string> using namespace std; struct t { string data; t(string new_data) { data = new_data; } // 原有的成员运算符,负责处理 t + const char* 的场景 string operator +(const char *operand) { return data + string(operand); } }; // 新增全局运算符,负责处理 const char* + t 的场景 string operator+(const char* lhs, const t& rhs) { return string(lhs) + rhs.data; } // 测试代码 int main() { t y = "text"; string x = "\r\n" + y; // 现在可以正常编译运行了 return 0; }
顺便补充两个实用细节:
- 如果你想让
t y = "text";这种隐式转换更严谨,可以给构造函数加上explicit关键字,然后用t y("text");来初始化对象,但这不是解决当前运算符问题的必要条件。 - 全局运算符里把
t的参数设为const引用,既能避免不必要的对象拷贝,也能兼容const t类型对象的相加场景。
内容的提问来源于stack exchange,提问作者user3100031
相关产品推荐
相关产品推荐

