C ++: ตัวแปร 'std :: ifstream ifs' มี initializer แต่เป็นประเภทที่ไม่สมบูรณ์


139

ขออภัยถ้านี่ไม่ใช่เสียงค่อนข้างสวย แต่ฉันค่อนข้างใหม่กับ C ++ ฉันพยายามเปิดไฟล์และอ่านโดยใช้ifstream:

vector<string> load_f(string file) {
  vector<string> text;

  ifstream ifs(file);
  string buffer, str_line;

  int brackets = 0;
  str_line = "";

  while ( getline(ifs, buffer) ) {
    buffer = Trim( buffer );
    size_t s = buffer.find_first_of("()");

    if (s == string::npos) str_line += "" + buffer;
    else {
      while ( s != string::npos ) {
        str_line += "" + buffer.substr(0, s + 1);
        brackets += (buffer[s] == '(' ? 1 : -1);

        if ( brackets == 0 ) {
          text.push_back( str_line );
          str_line = "";
        }

        buffer = buffer.substr(s + 1);
        s = buffer.find_first_of("()");
      }
    }
  }

  return text;
}

อย่างไรก็ตามฉันได้รับข้อผิดพลาดต่อไปนี้ฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร:

variable 'std::ifstream ifs' has initializer but incomplete type

คำตอบชื่นชมมาก โปรดทราบว่าฉันไม่เคยลืม#include <fstream>เนื่องจากมีหลายคนได้รับข้อผิดพลาดเนื่องจากเพียงลืมที่จะรวมส่วนหัว

แก้ไข:

ปรากฎว่าจริง ๆ แล้วฉันลืมที่จะรวมfstreamแต่ฉันลืมเพราะย้ายฟังก์ชั่นไปยังไฟล์อื่น


9
อ่านตอนท้ายของคำถาม ;)
beakr

6
คำตอบนี้ช่วยฉัน ในกรณีของฉันเป็นเพราะฉันลบไฟล์ส่วนหัวอื่นที่มี fstream ทางออกคือการรวม fstream
Andres Riofrio

12
<iostream>และไม่สร้างความสับสนให้กับ เพียง แต่<fstream>จะทำ
Joachim W

9
คำถามนี้ไม่ได้แปลเป็นภาษาท้องถิ่นมากเกินไป สิ่งนี้อธิบายปัญหาที่ฉันพบได้อย่างแน่นอน
Syndog

4
+1 สำหรับ OP รวมถึงคำตอบ ช่วยฉันเมื่อรวมรหัส dev อื่นที่สร้างขึ้นด้วยโครงการเก่ารวมถึงไม่ได้ส่งมาให้ฉันสำหรับการผสาน เห็นได้ชัดว่าไม่ได้ จำกัด หรือแคบเกินไป
Kenigmatic

คำตอบ:


105

นี้ดูเหมือนว่าจะได้รับการตอบ #include <fstream>-

ข้อความหมายถึง: -

incomplete type- คลาสไม่ได้ถูกกำหนดด้วยคลาสแบบเต็ม คอมไพเลอร์ได้เห็นข้อความเช่นclass ifstream;อนุญาตให้เข้าใจว่าคลาสมีอยู่ แต่ไม่ทราบว่าหน่วยความจำใช้ในระดับใด

การประกาศไปข้างหน้าช่วยให้คอมไพเลอร์เข้าใจมากขึ้น:

void BindInput( ifstream & inputChannel ); 

เข้าใจคลาสที่มีอยู่และสามารถส่งพอยน์เตอร์และการอ้างอิงผ่านโค้ดโดยไม่สามารถสร้างคลาสดูข้อมูลใด ๆ ภายในคลาสหรือเรียกวิธีการใด ๆ ของคลาส

has initializerดูเหมือนว่าภายนอกบิต แต่บอกว่าวัตถุที่ไม่สมบูรณ์จะถูกสร้างขึ้น


7
ฉันมั่นใจว่าคุณหมายถึง#include <fstream>ไม่ใช่#include <ifstream>
Alex Ryan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.