Neden bir dize koyamıyorum?


143

Neden bunu sevemiyorum cout string:

string text ;
text = WordList[i].substr(0,20) ;
cout << "String is  : " << text << endl ;

Bunu yaptığımda, aşağıdaki hatayı alıyorum:

Hata 2 hatası C2679: ikili '<<': 'std :: string' türünde sağdan işlenen alan bir operatör bulunamadı (veya kabul edilebilir bir dönüştürme yok) c: \ users \ mollasadra \ belgeler \ visual studio 2008 \ projeler \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

Şaşırtıcı, bu bile çalışmıyor:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;

Hata mesajında ​​düzenleyebilir misiniz?
Troyen

1
Öyle mi #include <iostream>?
Konerak

yeterli bilgi yok. hata nedir
alexD

Bunu ben yaptım. ama yine sorunum var.
Ata

Tüm dosyayı gönderebilir misiniz? Bunu bir işleve çağırıp çağırmadığınızı bilmiyoruz, doğru şeyleri dahil
ettiyseniz

Yanıtlar:


241

Eklemeniz gerekiyor

#include <string>
#include <iostream>

7
ve ayrıca using namespace stdveya using std::cout; using std::endl;
fardjad

2
Evet, ama sanırım içerdiği gibi string text;, düzenleme (hata hatası) da hata yok , bu sorunun değil eksik stringbaşlık olduğunu söylüyor .
Kiril Kirov

57
+1: Visual C ++ 'da (<iostream> dahil) birçok STL başlığı std::basic_stringsınıfın bir tanımını çeker (çünkü dolaylı olarak uygulama tanımlı <xstring> üstbilgisini içerirler (bunu asla doğrudan içermezler )). Bu, string sınıfını kullanmanıza izin verirken, ilgili operator<<<string> başlığında tanımlanır, bu yüzden bunu manuel olarak eklemeniz gerekir. Ayrıca std::basic_stringVC ++ 'daki çalışmaların tanımını dolaylı olarak dahil etmek için diğer başlıklara güvenmekle birlikte , tüm derleyicilerde çalışmaz.
Sven

6
Sven- Yorumunuz harika! Ben bu sorgulayıcı benzer bir sorun vardı, derleyici operatör >> std :: cin ve std :: string türleri için tanımlanmadı dedi. Görünüşe göre <iostream> vardı ama <string> 'i unutmuşum. Ben std :: string tanımlı değil şikayet olurdu linux w / gcc üzerinde çalışmaya alışkınım. Yorumunuz, neden operatörle ilgili şikayeti aldığımızı mükemmel bir şekilde açıklıyor. Teşekkürler!!
Daniel Goldfarb

2
Bu çalışıyor. Kodumdaki #include <string> satırını kaçırdım. Teşekkürler.
Hao Nguyen

11

Bir stdşekilde cout'un ad alanına başvurmanız gerekir . Örneğin,

using std::cout;
using std::endl;

işlev tanımınızın veya dosyanın üzerine tıklayın.


6

Kodunuzla ilgili birkaç sorun var:

  1. WordListhiçbir yerde tanımlanmamış. Kullanmadan önce tanımlamanız gerekir.
  2. Sadece böyle bir işlevin dışında kod yazamazsınız. Bir işleve koymanız gerekir.
  3. Sen gerek #include <string>sen kullanmadan önce dize sınıf ve iostream kullanmadan önce coutveya endl.
  4. string, coutVe endlcanlı stdsen onları önek olmadan bunları erişemez, böylece ad std::kullanmak sürece usingilk kapsam içine getirmek için yönergeyi.

hiçbiri benim için çalışmadı, sorun substr
Ata

1

Yukarıdaki cevaplar iyidir, ancak dize dahil etmek istemiyorsanız, aşağıdakileri kullanabilirsiniz

ostream& operator<<(ostream& os, string& msg)
{
os<<msg.c_str();

return os;
}

0

Std :: dizesini const char * 'a dönüştürmek için c_str () kullanın.

cout << "String is  : " << text.c_str() << endl ;

-1

Referans vermeniz std::coutveya std::endlaçıkça belirtmeniz gerekmez .
Her ikisi de namespace std. her zaman using namespace stdkapsam çözümleme operatörü kullanmak yerine ::daha kolay ve daha temiz hale getirir.

#include<iostream>
#include<string>
using namespace std;

5
StackOverflow'a hoş geldiniz, fark etmemiş olabilirsiniz ancak bu, kabul edilen cevabın yorumlarından birinde ele alındı.
Andon M. Coleman

-3

Linux sistemi kullanıyorsanız, eklemeniz gerekir

using namespace std;

Başlıkların altında

Pencereler varsa, üstbilgileri doğru yerleştirdiğinizden emin olun #include<iostream.h>

#include<string.h>

Mükemmel çalıştığını düşünün.

#include <iostream>
#include <string>

int main ()
{
std::string str="We think in generalities, but we live in details.";
                                       // (quoting Alfred N. Whitehead)

  std::string str2 = str.substr (3,5);     // "think"

   std::size_t pos = str.find("live");      // position of "live" in str

  std::string str3 = str.substr (pos);     
// get from "live" to the end

  std::cout << str2 << ' ' << str3 << '\n';

  return 0;
}

using namespace std;hedef işletim sistemi ile ilgisi yoktur linux. Benzer şekilde, ilave .hetmek içerir olmanın pencereleri os hedefle ilgisi yoktur, #include <iostream>ve #include <string>pencerelerde çalışacaktır.
StaticBeagle
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.