ทำไมฉันไม่สามารถคัดออกสตริง?


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 ;

คุณสามารถแก้ไขในข้อความแสดงข้อผิดพลาดได้หรือไม่?
Troyen

1
คุณไม่#include <iostream>?
Konerak

ข้อมูลไม่เพียงพอ ข้อผิดพลาดคืออะไร
alexD

ฉันทำอย่างนั้น แต่อีกครั้งฉันมีปัญหา
Ata

คุณสามารถโพสต์ไฟล์ทั้งหมดได้ไหม เราไม่ทราบว่าคุณกำลังเรียกสิ่งนี้ในฟังก์ชั่นหรือไม่ถ้าคุณรวมสิ่งที่ถูกต้องและอื่น ๆ ...
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 ++ ทางอ้อมแต่มันจะไม่ทำงานกับคอมไพเลอร์ทั้งหมด
Sven

6
Sven- ความคิดเห็นของคุณยอดเยี่ยมมาก! ฉันมีปัญหาคล้ายกันกับผู้ถามคนนี้คอมไพเลอร์กล่าวว่าตัวดำเนินการ >> ไม่ได้ถูกกำหนดไว้สำหรับประเภท std :: cin และ std :: string ปรากฏว่าฉันมี <iostream> แต่ลืม <string> ฉันเคยทำงานกับ linux w / gcc ซึ่งจะบ่นว่า std :: string ไม่ได้ถูกกำหนด ความคิดเห็นของคุณอธิบายอย่างสมบูรณ์ว่าทำไมเราถึงได้รับการร้องเรียนเกี่ยวกับผู้ดำเนินการแทน ขอบคุณ !!
Daniel Goldfarb

2
วิธีนี้ใช้ได้ผล ฉันพลาดสาย #include <string> ในรหัสของฉัน ขอบคุณ
Hao Nguyen

11

คุณจำเป็นต้องอ้างอิง namespace ศาลของstdอย่างใด ตัวอย่างเช่นแทรก

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

ด้านบนของนิยามฟังก์ชั่นของคุณหรือไฟล์


6

รหัสของคุณมีปัญหาหลายประการ:

  1. WordListไม่ได้กำหนดไว้ทุกที่ คุณควรกำหนดไว้ก่อนที่จะใช้
  2. คุณไม่สามารถเขียนโค้ดภายนอกฟังก์ชั่นเช่นนี้ได้ คุณต้องใส่มันเข้าไปในฟังก์ชั่น
  3. คุณจำเป็นต้อง#include <string>ก่อนที่คุณจะสามารถใช้คลาสสตริงและ iostream ก่อนที่คุณจะใช้หรือcoutendl
  4. string, coutและendlอาศัยอยู่ในstdnamespace ดังนั้นคุณจึงไม่สามารถเข้าถึงได้โดยไม่ต้อง prefixing พวกเขาด้วยstd::เว้นแต่คุณจะใช้usingคำสั่งที่จะนำพวกเขาไปสู่ขอบเขตแรก

ไม่มีใครทำงานให้ฉันดูเหมือนว่าปัญหาจะเกิดขึ้นกับพื้นผิว
Ata

1

คำตอบข้างต้นเป็นสิ่งที่ดี แต่ถ้าคุณไม่ต้องการเพิ่มการรวมสตริงคุณสามารถใช้คำสั่งต่อไปนี้

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

return os;
}


-1

คุณไม่จำเป็นต้องอ้างอิงstd::coutหรือstd::endlอย่างชัดเจน พวกเขาทั้งสองรวมอยู่ใน
แทนที่จะใช้โอเปอเรเตอร์ความละเอียดขอบเขตทุกครั้งที่ทำได้ง่ายและสะอาดขึ้นnamespace stdusing namespace std::

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

5
ยินดีต้อนรับสู่ StackOverflow คุณอาจไม่ได้สังเกต แต่นี่ถูกแก้ไขในหนึ่งในความคิดเห็นของคำตอบที่ยอมรับ
Andon M. Coleman

-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ไปยังรวมไม่มีอะไรเกี่ยวข้องกับระบบปฏิบัติการเป้าหมายเป็น windows #include <iostream>และ#include <string>จะทำงานบน windows
StaticBeagle
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.