错误:types为“const char ”和“const char ”的操作数无效到二元运算符+

在我的文件的顶部,我有

#define AGE "42" 

在文件后面我多次使用ID,包括一些看起来像的行

 1 std::string name = "Obama"; 2 std::string str = "Hello " + name + " you are " + AGE + " years old!"; 3 str += "Do you feel " + AGE + " years old?"; 

我得到的错误:

“错误:types'const char [35]'和'const char [2]'的无效操作数转换为二元运算符+'”

在线3.我做了一些研究,发现这是因为C ++如何处理不同的string,并能够通过将“年龄”更改为“string(AGE)”来修复它。 然而,我意外地错过了其中的一个例子,直到今天,我想知道为什么编译器不抱怨,即使我还有一个例子,只是“年龄”。

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

我的问题是“在后台发生了什么事情,C ++不喜欢将string与预处理程序放在其中的string连接起来,除非您还要连接在函数中定义的string。

考虑一下:

 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* s。 但是这很好:

 std::string str = std::string("Hello ") + "there " + "world"; // ok 

因为一旦你转换成了std::string ,你可以根据需要添加更多的char*

如果仍然令人困惑,可以添加一些括号来突出显示关联规则,然后用它们的typesreplacevariables名称:

 ((std::string("Hello ") + "there ") + "world"); ((string + char*) + char*) 

第一步是调用标准库中定义的string operator+(string, char*) 。 用它们的结果replace这两个操作数给出:

 ((string) + char*) 

这正是我们刚刚做的,哪一个还是合法的。 但是尝试一下:

 ((char* + char*) + string) 

而你卡住了,因为第一个操作试图添加两个char* s。

这个故事的道德:如果你想确保一个串联链将起作用,只要确保前两个参数之一是明确的typesstd::string

AGE被定义为"42"所以行:

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

被转换为:

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

这是无效的,因为"Do you feel ""42"都是const char[] 。 要解决这个问题,你可以使一个std::string ,或者只是删除+

 // 1. str += std::string("Do you feel ") + AGE + " years old?"; // 2. str += "Do you feel " AGE " years old?"; 

在第2行中,有一个std::string参与( name )。 有为char[] + std::stringstd::string + char[]等定义的操作。 "Hello " + name给出一个std::string ,它被添加到" you are " ,给另一个string,等等

在第3行,你是说

 char[] + char[] + char[] 

你不能只是添加arrays对方。

你不能像这样连接原始string。 operator+只能用于两个std::string对象或一个std::string和一个原始string(在操作的任一侧)。

 std::string s("..."); s + s; // OK s + "x"; // OK "x" + s; // OK "x" + "x" // error 

最简单的解决scheme是先将原始string转换为std::string

 "Do you feel " + std::string(AGE) + " years old?"; 

当然,你不应该首先使用macros。 C ++不是C.使用const或,在C ++ 11中有适当的编译器支持, constexpr

我的代码中有同样的问题。 我连接了一个string来创build一个string。 以下是代码的一部分。

 int scannerId = 1; std:strring testValue; strInXml = std::string(std::string("<inArgs>" \ "<scannerID>" + scannerId) + std::string("</scannerID>" \ "<cmdArgs>" \ "<arg-string>" + testValue) + "</arg-string>" \ "<arg-bool>FALSE</arg-bool>" \ "<arg-bool>FALSE</arg-bool>" \ "</cmdArgs>"\ "</inArgs>");