错误:类型 '为const char [35]' 的无效操作数和 '为con

2019-05-13 04:14发布

在我的文件的顶部,我有

#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 ++不喜欢串联与预处理放在那里,除非你也串联您在函数中定义字符串中的一个字符串。”

Answer 1:

试想一下:

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



Answer 2:

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


Answer 3:

在第2行,有一个std::string参与( name )。 有用于定义操作char[] + std::stringstd::string + char[]"Hello " + name给人std::string ,它被添加到" you are " ,给另一个字符串,等等

在第3行,你说

char[] + char[] + char[]

你不能只是增加阵列彼此。



Answer 4:

不能连接这样的原始字符串。 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



Answer 5:

在这种特殊情况下,一个更简单的解决将是刚刚摆脱的“+”一起,因为年龄是一个字符串文字和什么来之前,也是经过字符串文字。 你可以写3号线为:

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

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

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

该编译器将转换为:

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



Answer 6:

我在我的代码有同样的问题。 我是连接字符串创建一个字符串。 下面是代码的一部分。

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+’