文字列の連結が期待どおりに機能しない[クローズ]


84

これはよくある問題ですが、参考資料やその他の資料を探しても、この質問に対する明確な答えは見つかりません。

次のコードについて考えてみます。

#include <string>

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

コンパイラは、オーバーロードされた演算子が見つからないと言っています char[dim]

文字列に+演算子がないということですか?

しかし、いくつかの例では、このような状況があります。これがより多くの文字列を連結する正しい方法ではない場合、最良の方法は何ですか?


15
コードは正常にコンパイルされるはずです。つまり、エラーの原因となる正確なコードが表示されていないことを意味します(正確なエラーメッセージを投稿しないことに加えて)。
sbi 2010年

まあそれは動作しません...おそらく私のせいは私がコンパイラを提供しなかったことです...それはvcではなくg ++です... :)
Andry 2010年

回答:


153

書かれているように、あなたのコードは機能します。あなたはおそらく無関係であるが類似した何かを達成しようとしています:

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

C ++の場合、これは2つのcharポインターを追加しようとしているように見えるため、これは機能しません。代わりに、少なくとも1つのリテラルをに変換する必要があります。質問にすでに投稿したことを実行するか(私が言ったように、このコード機能します)、次のようにします。char*std::string

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

3
char *はポインタであり、メモリの割り当てが必要であるという理由だけで追加することはできません。std :: stringsは割り当てを非表示にします。これが、演算子+を提供できる理由です。
ヴィンセントロバート

12
@Andry:これが機能しない理由は、C ++が文字列リテラルをCから継承するためです。これが、文字列リテラルconst char[]std::string。ではなくタイプである理由です。C(したがってC ++でも)では、配列は非常に簡単にポインターに減衰します。そのため、「a」+「b」は2つのポインターを追加する組み込み演算子を呼び出します。その結果(メモリ内のどこかを指すポインタ)はもちろんまったく役に立たないですが、それにもかかわらず、これは私たちが立ち往生しているものです。
sbi 2010年

2
@Andry:合理的ですが間違っています。割り当てはこれとは何の関係もありません。@sbiによる説明は正しいものです(ポインターの追加の結果が別のポインターではないという事実は別として、結果が無意味になるため、2つのポインターを追加することは単純に不可能です)。
Konrad Rudolph

1
さらに、直接隣接する文字列リテラルは、コンパイラによって自動的に連結されます。std::string c = "Hello" "world";たとえば、は結果になりc == "Helloworld"ます。

1
文字列リテラルを使用することもできます。std;:string c = "hello"s + "world"s;または、そのうちの1つをstd::string
Rakete1111 2016年


5

私はこれをします:

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

これはVS2008でコンパイルされます。


1
gccでも動作するはずです。
graham.reeds 2010年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.