错误: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::string
, std::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>");