Dlaczego nie mogę znaleźć ciągu?

143

Dlaczego mi się to nie cout stringpodoba:

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

Kiedy to robię, pojawia się następujący błąd:

Błąd 2, błąd C2679: binarny „<<”: nie znaleziono operatora pobierającego prawostronny operand typu „std :: string” (lub nie ma akceptowalnej konwersji) c: \ users \ mollasadra \ documents \ visual studio 2008 \ projekty \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

To niesamowite, że nawet to nie działa:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;
Ata
źródło
Czy możesz edytować komunikat o błędzie?
Troyen
1
Zrobiłeś #include <iostream>?
Konerak
za mało informacji. jaki jest błąd
alexD
Ja to zrobiłem. ale znowu mam problem.
Ata
Czy możesz opublikować cały plik? Nie wiemy, czy wywołujesz to w funkcji, czy uwzględnisz odpowiednie rzeczy itp ...
Konerak,

Odpowiedzi:

241

Musisz uwzględnić

#include <string>
#include <iostream>
Kiril Kirov
źródło
7
a także using namespace stdlub using std::cout; using std::endl;
fardjad
2
Tak, ale myślę, że jest dołączony, ponieważ nie ma błędu przy string text;edycji (dodany błąd) mówi, że to nie jest problem, ale brakujący stringnagłówek.
Kiril Kirov
57
+1: wiele nagłówków STL w Visual C ++ (w tym <iostream>) std::basic_stringpobiera definicję klasy (ponieważ pośrednio zawierają zdefiniowany w implementacji nagłówek <xstring> ( nigdy nie zawierają tego bezpośrednio )). Chociaż umożliwia to użycie klasy ciągów, odpowiednie operator<<są zdefiniowane w samym nagłówku <string>, więc należy to uwzględnić ręcznie. Opierając się również na innych nagłówkach, aby pośrednio uwzględnić definicję std::basic_stringprac w VC ++, ale nie będzie to działać na wszystkich kompilatorach.
Sven
6
Sven- Twój komentarz jest niesamowity! Miałem podobny problem jak ten pytający, kompilator powiedział, że operator >> nie został zdefiniowany dla typów std :: cin i std :: string. Okazuje się, że miałem <iostream>, ale zapomniałem o tym <string>. Jestem przyzwyczajony do pracy na Linuksie w / gcc, który narzekałby, że nie zdefiniowano std :: string. Twój komentarz doskonale wyjaśnia, dlaczego zamiast tego otrzymaliśmy skargę na operatora. Dzięki!!
Daniel Goldfarb
2
To działa. Brakuje mi linii #include <string> w moim kodzie. Dzięki.
Hao Nguyen
11

Musisz stdjakoś odwołać się do przestrzeni nazw cout . Na przykład wstaw

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

nad definicją funkcji lub plikiem.

nperson325681
źródło
6

Z Twoim kodem jest kilka problemów:

  1. WordListnie jest nigdzie zdefiniowany. Powinieneś to zdefiniować przed użyciem.
  2. Nie możesz po prostu pisać kodu poza taką funkcją. Musisz umieścić to w funkcji.
  3. Musisz to zrobić, #include <string>zanim będziesz mógł użyć klasy string i iostream przed użyciem coutlub endl.
  4. string, coutA endlna żywo w stdprzestrzeni nazw, więc nie można uzyskać do nich dostęp bez poprzedzania ich std::chyba użyć usingdyrektywy w celu dostosowania ich do zakresu pierwszej kolejności.
sepp2k
źródło
żaden z nich nie działał dla mnie, wydaje się, że problem dotyczy substr
Ata
1

Powyższe odpowiedzi są dobre, ale jeśli nie chcesz dodawać ciągów include, możesz użyć następujących

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

return os;
}
Maheswar Reddy
źródło
0

Użyj c_str (), aby przekonwertować std :: string na const char *.

cout << "String is  : " << text.c_str() << endl ;
Anthony.
źródło
-1

Nie musisz się odwoływać std::coutani std::endlwyraźnie.
Oba są uwzględnione w namespace std. using namespace stdZamiast używać operatora rozdzielczości zakresu, za ::każdym razem jest łatwiejsze i czystsze.

#include<iostream>
#include<string>
using namespace std;
Ash Ghal
źródło
5
Witamy w StackOverflow, być może nie zauważyłeś, ale zostało to omówione w jednym z komentarzy do zaakceptowanej odpowiedzi.
Andon M. Coleman,
-3

Jeśli używasz systemu Linux, musisz dodać

using namespace std;

Poniżej nagłówki

W przypadku systemu Windows upewnij się, że nagłówki zostały umieszczone poprawnie #include<iostream.h>

#include<string.h>

Zobacz to działa idealnie.

#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;
}
pratikpchpr
źródło
using namespace std;nie ma nic wspólnego z docelowym systemem operacyjnym linux. Podobnie, dodanie .hdo dołączeń nie ma nic wspólnego z docelowym systemem operacyjnym będącym oknami #include <iostream>i #include <string>będzie działać w systemie Windows.
StaticBeagle