Warum kann ich keinen String finden?

143

Warum ich das nicht cout stringmögen kann:

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

Wenn ich das mache, erhalte ich den folgenden Fehler:

Fehler 2 Fehler C2679: Binär '<<': Es wurde kein Operator gefunden, der einen rechten Operanden vom Typ 'std :: string' verwendet (oder es gibt keine akzeptable Konvertierung). C: \ users \ mollasadra \ documents \ visual studio 2008 \ projekte \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

Es ist erstaunlich, dass auch das nicht funktioniert:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;
An einer
quelle
Können Sie die Fehlermeldung bearbeiten?
Troyen
1
Hast du #include <iostream>?
Konerak
nicht genug Infos. Was ist der Fehler
AlexD
Ich habe das getan Aber ich habe wieder ein Problem.
Ata
Können Sie die gesamte Datei posten? Wir wissen nicht, ob Sie dies in einer Funktion aufrufen, ob Sie die richtigen Dinge aufgenommen haben usw.
Konerak

Antworten:

241

Sie müssen einschließen

#include <string>
#include <iostream>
Kiril Kirov
quelle
7
und auch using namespace stdoder using std::cout; using std::endl;;
Fardjad
2
Ja, aber ich denke, es ist enthalten, da es string text;auch bei der Bearbeitung keinen Fehler gibt (hinzugefügter Fehler), dass dies nicht das Problem ist, sondern der fehlende stringHeader.
Kiril Kirov
57
+1: Viele STL-Header in Visual C ++ (einschließlich <iostream>) ziehen eine Definition der std::basic_stringKlasse ein (da sie indirekt den implementierungsdefinierten <xstring> -Header enthalten ( schließen Sie diesen niemals direkt ein )). Während dies Ihnen die Verwendung der Zeichenfolgenklasse ermöglicht, wird die relevante operator<<im <string> -Header selbst definiert, sodass Sie diese manuell einfügen müssen. Verlassen Sie sich auch auf andere Header, um indirekt die Definition von std::basic_stringWerken in VC ++ einzuschließen, aber es funktioniert nicht auf allen Compilern.
Sven
6
Sven: Dein Kommentar ist großartig! Ich hatte ein ähnliches Problem wie dieser Fragesteller. Der Compiler sagte, der Operator >> sei nicht für die Typen std :: cin und std :: string definiert. Es stellte sich heraus, dass ich <iostream> hatte, aber <string> vergessen hatte. Ich bin es gewohnt, unter Linux mit gcc zu arbeiten, was sich darüber beschwert hätte, dass std :: string nicht definiert ist. Ihr Kommentar erklärt perfekt, warum wir stattdessen die Beschwerde über den Betreiber erhalten haben. Vielen Dank!!
Daniel Goldfarb
2
Das funktioniert. Ich habe die Zeile #include <string> in meinem Code verpasst. Vielen Dank.
Hao Nguyen
11

Sie müssen stdirgendwie auf den Namespace des Couts verweisen . Zum Beispiel einfügen

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

über Ihrer Funktionsdefinition oder der Datei.

nperson325681
quelle
6

Es gibt verschiedene Probleme mit Ihrem Code:

  1. WordListist nirgendwo definiert. Sie sollten es definieren, bevor Sie es verwenden.
  2. Sie können nicht einfach Code außerhalb einer solchen Funktion schreiben. Sie müssen es in eine Funktion einfügen.
  3. Sie müssen, #include <string>bevor Sie die Zeichenfolgenklasse und iostream verwenden können, bevor Sie coutoder verwenden endl.
  4. string, coutUnd endlleben im stdNamensraum, so dass man sie nicht ohne mit ihnen voran zugreifen können , std::wenn Sie verwenden , um die usingerste Richtlinie , um sie in Umfang bringen.
sepp2k
quelle
Keiner von ihnen hat für mich funktioniert, es scheint, dass das Problem mit substr
Ata
1

Die obigen Antworten sind gut, aber wenn Sie kein String-Include hinzufügen möchten, können Sie Folgendes verwenden

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

return os;
}
Maheswar Reddy
quelle
0

Verwenden Sie c_str (), um den std :: string in const char * zu konvertieren.

cout << "String is  : " << text.c_str() << endl ;
Anthony.
quelle
-1

Sie müssen nicht std::coutoder std::endlexplizit referenzieren .
Sie sind beide in der enthalten namespace std. using namespace stdAnstatt ::jedes Mal den Scope Resolution Operator zu verwenden, ist dies einfacher und sauberer.

#include<iostream>
#include<string>
using namespace std;
Ash Ghal
quelle
5
Willkommen bei StackOverflow, Sie haben es vielleicht nicht bemerkt, aber dies wurde in einem der Kommentare der akzeptierten Antwort angesprochen.
Andon M. Coleman
-3

Wenn Sie ein Linux-System verwenden, müssen Sie hinzufügen

using namespace std;

Unter den Überschriften

Wenn Windows, dann stellen Sie sicher, dass Sie die Überschriften richtig setzen #include<iostream.h>

#include<string.h>

Verweisen Sie darauf, es funktioniert perfekt.

#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
quelle
using namespace std;hat nichts mit dem Ziel zu tun linux. In ähnlicher Weise hat das Hinzufügen von .hzu den Includes nichts mit dem Ziel- Betriebssystem Windows zu tun #include <iostream>und #include <string>funktioniert unter Windows.
StaticBeagle