Dizeleri birleştirme beklendiği gibi çalışmıyor [kapalı]


84

Bunun yaygın bir sorun olduğunu biliyorum, ancak referansları ve diğer materyalleri ararken bu soruya net bir cevap bulamıyorum.

Aşağıdaki kodu göz önünde bulundurun:

#include <string>

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

Derleyici bana için aşırı yüklenmiş bir operatör bulamadığını söylüyor char[dim].

Dizede + operatörünün olmadığı anlamına mı geliyor?

Ancak birkaç örnekte bunun gibi bir durum var. Daha fazla dizgeyi birleştirmenin doğru yolu bu değilse, en iyi yol nedir?


15
Kodunuz iyi bir şekilde derlenmelidir, bu da hataya neden olan kodu tam olarak göstermediğiniz anlamına gelir (tam hata mesajını göndermemenin yanı sıra).
sbi

İşe yaramıyor ... Muhtemelen benim hatam derleyici sağlamamış olmam ... bu g ++ değil vc ... :)
Andry

Yanıtlar:


153

Kodunuz yazıldığı şekliyle çalışıyor. Muhtemelen ilgisiz ama benzer bir şey başarmaya çalışıyorsunuz:

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

Bu işe yaramıyor çünkü C ++ için bu, iki charişaretçi eklemeye çalışıyormuşsunuz gibi görünüyor . Bunun yerine, ihtiyaç en az birini dönüştürmek için char*bir karşı değişmezleri std::string. Ya da zaten söz konusu gönderdiniz (dediğim gibi, bu kod ne yapabilirim olacaktır çalışmak) ya da aşağıdakileri yapın:

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

3
char * bir göstericidir ve sadece bellek tahsisi gerektirdiği için eklenemez. std :: strings ayırmayı gizler, bu nedenle onlar için bir + operatörü sağlamak mümkündür.
Vincent Robert

12
@Andry: Bunun işe yaramamasının nedeni, C ++ 'nın dize değişmezlerini C'den miras almasıdır, bu yüzden onlar const char[]değil tiptedirler std::string. C'de (ve dolayısıyla C ++ 'da) diziler çok kolay bir şekilde işaretleyicilere bozulur, bu nedenle "a" + "b" iki işaretçi ekleyen yerleşik operatörü çağırır. Bunun sonucu (hafızaya bir yeri işaret eden bir işaretçi) elbette oldukça yararsızdır, ancak yine de takılıp kaldığımız şey budur.
sbi

2
@Andry: makul ama yanlış. Tahsisatın bununla ilgisi yok. @Sbi tarafından verilen açıklama doğrudur (bir işaretçi toplamasının sonucunun başka bir işaretçi olmadığı gerçeği dışında - sonuç anlamsız olacağından iki işaretçi eklemek imkansızdır).
Konrad Rudolph

1
Ek olarak, doğrudan bitişik dize değişmezleri derleyici tarafından otomatik olarak birleştirilir. std::string c = "Hello" "world";, örneğin, sonuçlanacaktır c == "Helloworld".
Fang

1
Dize değişmezlerini de kullanabilirsiniz: std;:string c = "hello"s + "world"s;veya bunlardan yalnızca birini a yapabilirsiniz std::string.
Rakete1111


5

Bunu yapardım:

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

VS2008'de derlenen.


1
Gcc'de de çalışmalıdır.
graham.reeds

5
std::string a = "Hello ";
std::string b = "World ";
std::string c = a;
c.append(b);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.