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 ;

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>

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.


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.

ż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;
}

0

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

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

-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;

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;
}

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.