错误:“const char \[35\]”和“const char \[2\]”类型的无效操作数到二进制“operator”

新手上路,请多包涵

在我的文件顶部,我有

#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?";

我得到错误:

“错误:’const char [35]’ 和 ‘const char [2]’ 类型的无效操作数到二进制 ‘operator+‘”

在第 3 行。我做了一些研究,发现这是因为 C++ 如何处理不同的字符串,并且能够通过将“AGE”更改为“string(AGE)”来修复它。但是,直到今天,我不小心错过了其中一个实例,并且想知道为什么编译器没有抱怨,即使我仍然有一个只是“AGE”的实例。

通过一些试验和错误,我发现我只需要 string(AGE) 在我不连接在函数体中创建的另一个字符串的行上。

我的问题是“在后台发生了什么,C++ 不喜欢将字符串与预处理器放置的字符串连接起来,除非你也在连接你在函数中定义的字符串。”

原文由 janovak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 579
2 个回答

考虑一下:

 std::string str = "Hello " + "world"; // bad!

operator + 的右轴和左轴都是 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* s。但这很好:

 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* s。

故事的寓意:如果您想确保连接链能够正常工作,只需确保前两个参数之一是明确的类型 std::string

原文由 dlf 发布,翻译遵循 CC BY-SA 3.0 许可协议

在这种特殊情况下,一个更简单的解决方法是一起去掉“+”,因为 AGE 是一个字符串文字,而之前和之后的也是字符串文字。您可以将第 3 行写为:

str += "Do you feel " AGE " years old?";

这是因为大多数 C/C++ 编译器会自动连接字符串文字。以上等价于:

str += "Do you feel " "42" " years old?";

编译器将转换为:

str += "Do you feel 42 years old?";

原文由 djulien 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题