문자열 연결이 예상대로 작동하지 않음 [닫힘]


84

나는 그것이 일반적인 문제라는 것을 알고 있지만 참조 및 기타 자료를 찾고 있으면이 질문에 대한 명확한 답을 찾지 못했습니다.

다음 코드를 고려하십시오.

#include <string>

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

컴파일러는에 대한 오버로드 된 연산자를 찾을 수 없다고 알려줍니다 char[dim].

문자열에 + 연산자가 없다는 의미입니까?

그러나 몇 가지 예에서 이와 같은 상황이 있습니다. 이것이 더 많은 문자열을 연결하는 올바른 방법이 아니라면 가장 좋은 방법은 무엇입니까?


15
코드는 잘 컴파일되어야합니다. 즉, 정확한 오류 메시지를 게시하지 않고 오류를 발생시키는 정확한 코드를 표시하지 않습니다.
sbi

글쎄 그것은 작동하지 않습니다 ... 아마도 내 잘못은 내가 컴파일러를 제공하지 않았다는 것입니다 ... 그것은 vc가 아닌 g ++입니다 ... :)
Andry

답변:


153

작성된대로 코드가 작동합니다. 아마도 관련이 없지만 비슷한 것을 얻으려고 할 것입니다.

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

이것은 C ++의 경우 두 개의 char포인터 를 추가하려는 것처럼 보이기 때문에 작동하지 않습니다 . 대신, 당신은 필요 의 적어도 하나의 변환 char*A와 리터럴을 std::string. 질문에 이미 게시 한 작업을 수행하거나 (내가 말했듯이이 코드 작동 함) 다음을 수행 할 수 있습니다.

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

3
char *는 포인터이며 메모리 할당이 필요하기 때문에 추가 할 수 없습니다. std :: strings는 할당을 숨기므로 operator +를 제공 할 수 있습니다.
Vincent Robert

12
@Andry : 이것이 작동하지 않는 이유는 C ++가 C에서 문자열 리터럴을 상속 const char[]하기 때문 std::string입니다. C (따라서 C ++에서도) 배열은 포인터로 매우 쉽게 붕괴됩니다. 이것이 "a"+ "b"가 두 개의 포인터를 추가하는 내장 연산자를 호출하는 이유입니다. 그 결과 (어딘가 메모리를 가리키는 포인터)는 당연히 쓸모가 없지만 그럼에도 불구하고 우리가 붙어있는 것입니다.
sbi

2
@Andry : 합리적이지만 잘못되었습니다. 할당은 이것과 아무 관련이 없습니다. @sbi에 의해 주어진 설명은 올바른 것입니다 (포인터 추가의 결과가 다른 포인터가 아니라는 사실을 제외하고 – 결과가 무의미하기 때문에 두 개의 포인터를 추가하는 것은 단순히 불가능합니다).
Konrad Rudolph

1
또한 직접 인접한 문자열 리터럴은 컴파일러에 의해 자동으로 연결됩니다. std::string c = "Hello" "world";예를 들어는 c == "Helloworld".
Fang

1
문자열 리터럴을 사용할 수도 있습니다. std;:string c = "hello"s + "world"s;또는 그 중 하나를 std::string.
Rakete1111


5

나는 이것을 할 것이다 :

std::string a("Hello ");
std::string b("World");
std::string c = a + b;

VS2008에서 컴파일됩니다.


1
gcc에서도 작동합니다.
graham.reeds

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.