连接字符串无法按预期工作[关闭]


84

我知道这是一个常见问题,但是在寻找参考资料和其他材料时,我找不到这个问题的明确答案。

考虑以下代码:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

编译器告诉我找不到的重载运算符char[dim]

这是否意味着字符串中没有+运算符?

但在几个示例中,会出现这种情况。如果这不是连接更多字符串的正确方法,最好的方法是什么?


15
您的代码应该可以正常编译,这意味着您没有显示导致错误的确切代码(除了未发布确切的错误消息之外)。
2010年

好吧,它不起作用...可能是我的错,是我没有提供编译器...这是g ++而不是vc ... :)
Andry 2010年

Answers:


153

您编写的代码可以正常工作。您可能正在尝试实现一些不相关但相似的东西:

std::string c = "hello" + "world";

这是行不通的,因为对于C ++,这似乎是您要添加两个char指针。相反,您需要将至少一个char*文字转换为std::string。您可以执行已经在问题中发布的内容(如我所说,此代码起作用),或者执行以下操作:

std::string c = std::string("hello") + "world";

3
char *是一个指针,不能仅仅因为它需要分配内存而不能添加。std :: strings隐藏分配,这就是为什么可以为它们提供operator +的原因。
文森特·罗伯特,2010年

12
@Andry:之所以不起作用,是因为C ++从C继承了其字符串文字,这就是它们属于类型const char[]而不是的原因std::string。在C中(因此也在C ++中),数组很容易衰减到指针,这就是为什么“ a” +“ b”将调用添加两个指针的内置运算符的原因。这样的结果(指向内存某处的指针)当然是没有用的,但这仍然是我们所坚持的。
2010年

2
@安德里:合理但错误。分配与此无关。@sbi给出的解释是正确的(除了指针添加的结果不是另一个指针的事实之外,根本不可能添加两个指针,因为结果将毫无意义)。
康拉德·鲁道夫

1
此外,编译器会自动直接连接直接相邻的字符串文字。std::string c = "Hello" "world";例如,将导致c == "Helloworld"

1
您还可以使用字符串文字:std;:string c = "hello"s + "world"s;或仅将其中一个设为std::string
Rakete1111 '16



5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.