在我的文件顶部
#define AGE "42"
稍后在文件中我多次使用 ID,包括一些看起来像的行
std::string name = "Obama";
std::string str = "Hello " + name + " you are " + AGE + " years old!";
str += "Do you feel " + AGE + " years old?";
我得到错误:
"error: invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator+’"
在第 3 行。我做了一些研究,发现这是因为 C++ 如何处理不同的字符串,并且能够通过将“AGE”更改为“string(AGE)”来修复它。但是,直到今天我不小心错过了其中一个实例,并且想知道为什么编译器没有提示,即使我仍然有一个只是“AGE”的实例。
通过反复试验,我发现我只需要 string(AGE)
在我不连接在函数体中创建的另一个字符串的行上。
我的问题是“在后台发生了什么,C++ 不喜欢将字符串与预处理器放置的字符串连接起来,除非你也在连接你在函数中定义的字符串。”
最佳答案
考虑一下:
std::string str = "Hello " + "world"; // bad!
operator +
的 rhs 和 lhs 都是 char*
s。 operator +
没有定义需要两个 char*
(事实上,该语言不允许您编写一个)。结果,在我的编译器上,这会产生“无法添加两个指针”错误(您的显然是用数组来表达事物,但这是同样的问题)。
现在考虑一下:
std::string str = "Hello " + std::string("world"); // ok
是一个 operator +
的定义,它接受一个 const char*
作为 lhs 和一个 std::string
作为 rhs,所以现在每个人都很高兴。
您可以将其扩展到任意长度的串联链。不过,它可能会变得困惑。例如:
std::string str = "Hello " + "there " + std::string("world"); // no good!
这不起作用,因为您在将 lhs 转换为 std::string
之前尝试 +
两个 char*
.但这很好:
std::string str = std::string("Hello ") + "there " + "world"; // ok
因为一旦您转换为 std::string
,您可以根据需要 +
任意数量的附加 char*
。
如果这仍然令人困惑,添加一些括号以突出显示关联性规则然后将变量名称替换为它们的类型可能会有所帮助:
((std::string("Hello ") + "there ") + "world");
((string + char*) + char*)
第一步是调用string operator+(string, char*)
,在标准库中定义。用它们的结果替换这两个操作数给出:
((string) + char*)
这正是我们刚刚所做的,并且仍然是合法的。但是尝试同样的事情:
((char* + char*) + string)
你被卡住了,因为第一个操作试图添加两个 char*
。
故事的寓意:如果您想确保串联链能够正常工作,只需确保前两个参数中的一个显式类型为 std::string
。
关于c++ - 错误 : invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator+’ ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23936246/