Чому я не можу накинути рядок?


143

Чому мені це не cout stringподобається:

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

Коли я це роблю, я отримую таку помилку:

Помилка 2 Помилка C2679: двійковий '<<': не знайдено жодного оператора, який приймає правий операнд типу 'std :: string' (або прийнятне перетворення немає) c: \ users \ mollasadra \ dokumenti \ visual studio 2008 \ проекти \ barnamec \ barnamec \ barnamec.cpp 67 barnamec **

Дивно, що навіть це не працює:

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

Чи можете ви редагувати повідомлення про помилку?
Troyen

1
Ти що #include <iostream>?
Конерак

недостатньо інформації. яка помилка
alexD

Я це зробив. але знову ж таки, у мене проблема.
Ата

Чи можете ви опублікувати весь файл? Ми не знаємо, чи викликаєте ви це в функції, якщо ви включили потрібні речі тощо ...
Konerak,

Відповіді:


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

Вам потрібно stdякось посилатися на простір імен cout . Наприклад, вставити

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

поверх визначення функції або файлу.


6

У коді є кілька проблем:

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

жоден з них не працював на мене, схоже, проблема з substr
Ата

1

Наведені вище відповіді хороші, але якщо ви не хочете додавати рядок include, ви можете скористатись наступним

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

return os;
}

0

Використовуйте c_str () для перетворення рядка std :: в 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 <iostream>і воно #include <string>буде працювати на windows.
StaticBeagle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.