C ++: variabel 'std :: ifstream ifs' memiliki penginisialisasi tetapi jenisnya tidak lengkap

147

Maaf jika ini sangat noobish, tapi saya cukup baru mengenal C ++. Saya mencoba membuka file dan membacanya menggunakan 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;
}

Namun, saya mendapatkan kesalahan berikut, saya tidak yakin bagaimana cara memperbaikinya:

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

Jawaban sangat dihargai. Perhatikan bahwa saya tidak pernah lupa #include <fstream>, karena banyak yang mendapatkan kesalahan karena lupa menyertakan header.

EDIT:

Ternyata saya benar-benar lupa untuk memasukkannya fstream, tapi saya lupa karena memindahkan fungsi ke file lain.

paruhr
sumber
9
Baca akhir pertanyaannya. ;)
paruh
6
Jawaban ini membantu saya. Dalam kasus saya, itu karena saya menghapus file header lain yang menyertakan fstream. Solusinya adalah memasukkan fstream.
Andres Riofrio
13
Dan jangan bingung dengan <iostream>. Hanya <fstream>akan dilakukan.
Joachim W
9
Pertanyaan ini TIDAK terlalu terlokalisasi. Ini menjelaskan dengan tepat masalah yang saya alami.
Syndog
4
1 untuk OP termasuk jawabannya. Membantu saya saat menggabungkan kode pengembang lain yang dibangun dengan proyek basi termasuk tidak dikirim kepada saya untuk digabungkan. Jelas tidak terlalu terlokalisasi atau sempit.
Kenigmatic

Jawaban:

112

Ini sepertinya dijawab - #include <fstream>.

Pesan itu berarti: -

incomplete type- kelas belum ditentukan dengan kelas lengkap. Kompilator telah melihat pernyataan seperti class ifstream;yang memungkinkannya untuk memahami bahwa suatu kelas ada, tetapi tidak mengetahui berapa banyak memori yang digunakan kelas tersebut.

Deklarasi maju memungkinkan kompilator untuk lebih memahami: -

void BindInput( ifstream & inputChannel ); 

Ia memahami bahwa kelas itu ada, dan dapat mengirim petunjuk dan referensi melalui kode tanpa dapat membuat kelas, melihat data apa pun di dalam kelas, atau memanggil metode kelas apa pun.

The has initializertampaknya asing sedikit, tetapi mengatakan bahwa obyek yang tidak lengkap sedang dibuat.

mksteve.dll
sumber
8
Saya yakin maksud Anda #include <fstream>, bukan#include <ifstream>
Alex Ryan