Por que não consigo separar uma string?

143

Por que não posso cout stringgostar disso:

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

Quando faço isso, recebo o seguinte erro:

Erro 2 erro C2679: binário '<<': nenhum operador encontrado que utiliza um operando à direita do tipo 'std :: string' (ou não há conversão aceitável) c: \ users \ mollasadra \ documents \ visual studio 2008 \ projetos \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

É incrível que mesmo isso não esteja funcionando:

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;
Ata
fonte
Você pode editar na mensagem de erro?
Troyen
1
Você fez #include <iostream>?
Konerak
informação insuficiente. qual é o erro
alexD 12/06
Eu fiz isso. mas novamente, eu tenho problema.
Ata
Você pode postar o arquivo inteiro? Não sei se você está chamando isso de uma função, se você incluiu as coisas certas, etc ...
Konerak

Respostas:

241

Você precisa incluir

#include <string>
#include <iostream>
Kiril Kirov
fonte
7
e também using namespace stdou using std::cout; using std::endl;
fardjad
2
Sim, mas acho que está incluído, pois também não há erro na string text;edição (erro adicionado), que este não é o problema, mas o stringcabeçalho ausente .
22411 Kiril Kirov
57
+1: muitos cabeçalhos STL no Visual C ++ (incluindo <iostream>) obtêm uma definição da std::basic_stringclasse (porque incluem indiretamente o cabeçalho <xstring> definido pela implementação ( nunca inclua isso diretamente )). Embora isso permita que você use a classe string, o relevante operator<<é definido no próprio cabeçalho <string>, portanto você deve incluí-lo manualmente. Também depende de outros cabeçalhos para incluir indiretamente a definição de std::basic_stringobras no VC ++, mas não funcionará em todos os compiladores.
Sven
6
Sven- Seu comentário é demais! Eu tive um problema semelhante ao questionador, o compilador disse que o operador >> não foi definido para os tipos std :: cin e std :: string. Acontece que eu tinha <iostream>, mas tinha esquecido <string>. Estou acostumado a trabalhar no linux w / gcc que teria reclamado que std :: string não está definido. Seu comentário explica perfeitamente por que recebemos a reclamação sobre o operador. Obrigado!!
Daniel Goldfarb
2
Isso funciona. Eu perdi a linha #include <string> no meu código. Obrigado.
Hao Nguyen
11

Você precisa fazer referência ao namespace do cout de stdalguma forma. Por exemplo, insira

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

sobre sua definição de função ou o arquivo

nperson325681
fonte
6

Existem vários problemas com o seu código:

  1. WordListnão está definido em nenhum lugar. Você deve defini-lo antes de usá-lo.
  2. Você não pode simplesmente escrever código fora de uma função como esta. Você precisa colocá-lo em uma função.
  3. Você precisa #include <string>antes de poder usar a classe string e o iostream antes de usar coutou endl.
  4. string, coutE endlao vivo no stdespaço de nomes, então você não pode acessá-los sem prefixar-los com std::a menos que você use a usingdirectiva para trazê-los para o escopo em primeiro lugar.
sepp2k
fonte
nenhum deles funcionou para mim, parece que problema é com substr
Ata
1

As respostas acima são boas, mas se você não deseja adicionar string include, pode usar o seguinte

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

return os;
}
Maheswar Reddy
fonte
0

Use c_str () para converter o std :: string em const char *.

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

Você não precisa fazer referência std::coutou std::endlexplicitamente.
Ambos estão incluídos no namespace std. using namespace stdem vez de usar o operador de resolução de escopo ::sempre que for mais fácil e limpo.

#include<iostream>
#include<string>
using namespace std;
Ash Ghal
fonte
5
Bem-vindo ao StackOverflow, você pode não ter percebido, mas isso foi abordado em um dos comentários da resposta aceita.
Andon M. Coleman
-3

Se você estiver usando o sistema linux, precisará adicionar

using namespace std;

Abaixo dos cabeçalhos

Se o Windows, certifique-se de colocar os cabeçalhos corretamente #include<iostream.h>

#include<string.h>

Consulte isso, ele funciona perfeitamente.

#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
fonte
using namespace std;não tem nada a ver com o objetivo do ser linux. Da mesma forma, adicionar as .hinclusões não tem nada a ver com o sistema operacional de destino como sendo o windows #include <iostream>e #include <string>funcionará no windows.
StaticBeagle