在我的文件的顶部,我有
#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?";
我得到的错误:
“错误:类型的无效操作数的常量字符[35]'和 '为const char [2]' 为二进制 '运算符+'”
在第3行我做了一些研究,发现这是因为C ++是如何处理不同的字符串,并能够通过更改“年龄”来修复它“字符串(AGE)”。 不过,我不小心错过了直到今天的一个实例,并想知道为什么编译器没有抱怨,即使我仍然有这样的情况:这只是“年龄”。
通过一些试验和错误,我发现,我只需要string(AGE)
在哪里我不串接在函数体中创造了另一个串线。
我的问题是“到底是怎么回事的背景下,C ++不喜欢串联与预处理放在那里,除非你也串联您在函数中定义字符串中的一个字符串。”
试想一下:
std::string str = "Hello " + "world"; // bad!
无论是RHS和LHS中operator +
是char*
秒。 没有定义operator +
采用两个char*
S(其实,语言不允许你写一个)。 其结果是,在我的编译器这产生了“不能添加两个指针”的错误(你显然短语东西在数组中的条款,但它是同样的问题)。
现在考虑这个:
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!
这是因为你试图不起作用+
2 char*
的LHS之前s已被转换成std::string
。 但是,这是罚款:
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
。
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 "
,给另一个字符串,等等
在第3行,你说
char[] + char[] + char[]
你不能只是增加阵列彼此。
不能连接这样的原始字符串。 operator+
仅具有两个工作std::string
对象或与一种std::string
和一个原始的字符串(在操作的任一侧)。
std::string s("...");
s + s; // OK
s + "x"; // OK
"x" + s; // OK
"x" + "x" // error
最简单的办法是把你的原始字符串成std::string
第一:
"Do you feel " + std::string(AGE) + " years old?";
当然,你不应该摆在首位使用宏。 C ++不是C.使用const
,或者在C ++ 11具有适当的编译器支持, constexpr
。
在这种特殊情况下,一个更简单的解决将是刚刚摆脱的“+”一起,因为年龄是一个字符串文字和什么来之前,也是经过字符串文字。 你可以写3号线为:
str += "Do you feel " AGE " years old?";
这是因为大多数C / C ++编译器会自动拼接字符串文字。 以上是等效于:
str += "Do you feel " "42" " years old?";
该编译器将转换为:
str += "Do you feel 42 years old?";
我在我的代码有同样的问题。 我是连接字符串创建一个字符串。 下面是代码的一部分。
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>");
文章来源: Error: invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator+’