¿Por qué no puedo hacer una cadena?

143

Por qué no me cout stringgusta esto:

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

Cuando hago esto, aparece el siguiente error:

Error 2 error C2679: binario '<<': no ​​se encontró ningún operador que tome un operando derecho del tipo 'std :: string' (o no hay una conversión aceptable) c: \ users \ mollasadra \ documents \ visual studio 2008 \ proyectos \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

Es sorprendente que incluso esto no funcione:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;
Ata
fuente
¿Se puede editar en el mensaje de error?
Troyen
1
¿Lo hiciste #include <iostream>?
Konerak
No hay suficiente información. cuál es el error
alexD
Yo he hecho eso. Pero de nuevo, tengo un problema.
Ata
¿Puedes publicar el archivo completo? No sabemos si está llamando a esto en una función, si incluyó las cosas correctas, etc ...
Konerak

Respuestas:

241

Necesitas incluir

#include <string>
#include <iostream>
Kiril Kirov
fuente
77
y también using namespace stdo using std::cout; using std::endl;
fardjad
2
Sí, pero supongo que está incluido, ya que no hay ningún error en string text;la edición (error agregado) que dice que este no es el problema sino el stringencabezado que falta .
Kiril Kirov
57
+1: Muchos encabezados STL en Visual C ++ (incluido <iostream>) incorporan una definición de la std::basic_stringclase (porque indirectamente incluyen el encabezado <xstring> definido por la implementación ( nunca lo incluyen directamente )). Si bien eso le permite usar la clase de cadena, lo relevante operator<<se define en el encabezado <string>, por lo que debe incluirlo manualmente. También depende de otros encabezados para incluir indirectamente la definición de std::basic_stringtrabajos en VC ++, pero no funcionará en todos los compiladores.
Sven
66
Sven- ¡Tu comentario es asombroso! Tuve un problema similar al de este interrogador, el compilador dijo que el operador >> no estaba definido para los tipos std :: cin y std :: string. Resulta que tenía <iostream> pero había olvidado <string>. Estoy acostumbrado a trabajar en Linux w / gcc, que se habría quejado de que std :: string no está definido. Su comentario explica perfectamente por qué recibimos la queja sobre el operador. ¡¡Gracias!!
Daniel Goldfarb
2
Esto funciona. Perdí la línea #include <string> en mi código. Gracias.
Hao Nguyen
11

Debe hacer referencia al espacio de nombres de cout de stdalguna manera. Por ejemplo, inserte

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

encima de la definición de su función o el archivo.

nperson325681
fuente
6

Hay varios problemas con su código:

  1. WordListno está definido en ningún lado. Debe definirlo antes de usarlo.
  2. No puede simplemente escribir código fuera de una función como esta. Necesitas ponerlo en una función.
  3. Debe hacerlo #include <string>antes de poder usar la clase de cadena y iostream antes de usar couto endl.
  4. string, couty endlvivir en el stdespacio de nombres, por lo que no puede acceder a ellos sin prefijarlos a std::menos que use la usingdirectiva para ponerlos en primer lugar.
sepp2k
fuente
ninguno de ellos funcionó para mí, parece que el problema es con substr
Ata
1

Las respuestas anteriores son buenas, pero si no desea agregar incluir cadenas, puede usar lo siguiente

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

return os;
}
Maheswar Reddy
fuente
0

Use c_str () para convertir std :: string a const char *.

cout << "String is  : " << text.c_str() << endl ;
Antonio.
fuente
-1

No tiene que hacer referencia std::coutni std::endlexplícitamente.
Ambos están incluidos en el namespace std. using namespace stden lugar de usar el operador de resolución de alcance ::cada vez que lo hace es más fácil y limpio.

#include<iostream>
#include<string>
using namespace std;
Ash Ghal
fuente
55
Bienvenido a StackOverflow, puede que no lo hayas notado, pero esto se abordó en uno de los comentarios de la respuesta aceptada.
Andon M. Coleman
-3

Si está utilizando el sistema Linux, entonces necesita agregar

using namespace std;

Debajo de los encabezados

Si hay ventanas, asegúrese de colocar los encabezados correctamente #include<iostream.h>

#include<string.h>

Consulte esto funciona perfectamente.

#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
fuente
using namespace std;no tiene nada que ver con el objetivo del ser linux. Del mismo modo, agregar el .ha las inclusiones no tiene nada que ver con que el sistema operativo objetivo sea Windows, #include <iostream>y #include <string>funcionará en Windows.
StaticBeagle