Почему я не могу найти строку?


143

Почему мне не cout stringнравится это:

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

Когда я делаю это, я получаю следующую ошибку:

Ошибка 2 ошибка C2679: двоичный файл «<<»: не найден оператор, который принимает правый операнд типа «std :: string» (или нет допустимого преобразования) c: \ users \ mollasadra \ documents \ visual studio 2008 \ проекты \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

Удивительно, что даже это не работает

string text ;
text = "hello"  ;
cout << "String is  : " << text << endl ;

Можете ли вы изменить сообщение об ошибке?
Троен

1
А вы #include <iostream>?
Конерак

недостаточно информации в чем ошибка
alexD

Я сделал это. но опять же у меня проблема.
Ата

Можете ли вы опубликовать весь файл? Мы не знаем, вызываете ли вы это в функции, правильно ли вы включили и т. Д.
Конерак

Ответы:


241

Вы должны включить

#include <string>
#include <iostream>

7
а также using namespace stdили using std::cout; using std::endl;
fardjad

2
Да, но я предполагаю, что это включено, так как нет ошибки, так string text;как редактирование (добавленная ошибка) говорит, что это не проблема, а отсутствующий stringзаголовок.
Кирилл Киров

57
+1: многие заголовки STL в Visual C ++ (включая <iostream>) извлекают определение std::basic_stringкласса (поскольку они косвенно включают в себя определенный в реализации заголовок <xstring> ( никогда не включайте его напрямую )). Хотя это позволяет вам использовать строковый класс, соответствующий operator<<объект определен в самом заголовке <string>, поэтому вы должны включить его вручную. Также полагаться на другие заголовки, чтобы косвенно включить определение std::basic_stringработ в VC ++, но это не будет работать на всех компиляторах.
Свен

6
Свен - Ваш комментарий потрясающий! У меня была похожая проблема, как у этого спрашивающего, компилятор сказал, что оператор >> не был определен для типов std :: cin и std :: string. Оказывается, у меня был <iostream>, но я забыл <string>. Я привык работать над linux w / gcc, который жаловался бы, что std :: string не определен. Ваш комментарий прекрасно объясняет, почему мы получили жалобу на оператора. Спасибо!!
Даниэль Голдфарб

2
Это работает. Я пропустил строку #include <string> в моем коде. Спасибо.
Хао Нгуен

11

Вам нужно как-то ссылаться на пространство имен stdCout. Например, вставить

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

поверх вашего определения функции или файла.


6

Есть несколько проблем с вашим кодом:

  1. WordListнигде не определено. Вы должны определить это, прежде чем использовать его.
  2. Вы не можете просто написать код вне такой функции. Вы должны поместить это в функцию.
  3. Вам нужно #include <string>прежде чем вы сможете использовать строковый класс и iostream перед тем, как использовать coutили endl.
  4. string, coutИ endlжить в stdпространстве имен, так что вы не можете получить доступ к ним без префиксов их , std::если вы не используете usingдирективу , чтобы привести их в рамки первой.

у меня ни один из них не сработал, похоже, проблема с субстратом
Ata

1

Приведенные выше ответы хороши, но если вы не хотите добавлять строку include, вы можете использовать следующие

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

return os;
}

0

Используйте c_str () для преобразования std :: string в const char *.

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

-1

Вы не должны ссылаться std::coutили std::endlявно.
Они оба включены в namespace std. using namespace stdВместо использования оператора разрешения области видимости ::каждый раз становится проще и чище.

#include<iostream>
#include<string>
using namespace std;

5
Добро пожаловать в StackOverflow, возможно, вы не заметили, но об этом говорится в одном из комментариев принятого ответа.
Андон М. Коулман

-3

Если вы используете систему Linux, то вам нужно добавить

using namespace std;

Ниже заголовков

Если окна, то убедитесь, что вы правильно поставили заголовки #include<iostream.h>

#include<string.h>

Отослать это отлично работает.

#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;не имеет ничего общего с целью linux. Точно так же, добавление .hк include не имеет ничего общего с целевой ОС Windows, #include <iostream>и #include <string>будет работать с окнами.
StaticBeagle
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.