C ++: biến 'std :: ifstream ifs' có bộ khởi tạo nhưng loại không đầy đủ


138

Xin lỗi nếu điều này khá vớ vẩn, nhưng tôi khá mới với C ++. Tôi đang cố mở một tệp và đọc nó bằng cách sử dụng 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;
}

Tuy nhiên, tôi nhận được lỗi sau Tôi không chắc chắn cách khắc phục:

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

Câu trả lời rất cảm kích. Lưu ý rằng tôi không bao giờ quên #include <fstream>, vì nhiều người đã nhận được lỗi do chỉ quên bao gồm tiêu đề.

BIÊN TẬP:

Hóa ra tôi thực sự đã quên bao gồm fstream, nhưng tôi đã quên do chuyển chức năng sang tập tin khác.


9
Đọc phần cuối của câu hỏi. ;)
beakr

6
Câu trả lời này đã giúp tôi. Trong trường hợp của tôi, đó là vì tôi đã xóa một tệp tiêu đề khác có chứa fux. Giải pháp là bao gồm cả dòng.
Andres Riofrio

12
Và đừng nhầm lẫn với <iostream>. Chỉ <fstream>sẽ làm.
Joachim W

9
Câu hỏi này KHÔNG quá cục bộ. Điều này giải thích chính xác vấn đề tôi đang gặp phải.
Syndog

4
+1 cho OP bao gồm câu trả lời. Đã giúp tôi khi hợp nhất mã nhà phát triển khác được xây dựng với dự án cũ bao gồm không gửi cho tôi để hợp nhất. Rõ ràng không quá cục bộ hoặc hẹp.
Kenigmatic

Câu trả lời:


104

Điều này dường như được trả lời - #include <fstream>.

Tin nhắn có nghĩa là: -

incomplete type- lớp chưa được xác định với một lớp đầy đủ. Trình biên dịch đã thấy các câu lệnh như class ifstream;cho phép nó hiểu rằng một lớp tồn tại, nhưng không biết lớp đó chiếm bao nhiêu bộ nhớ.

Khai báo chuyển tiếp cho phép trình biên dịch có ý nghĩa hơn về: -

void BindInput( ifstream & inputChannel ); 

Nó hiểu lớp tồn tại và có thể gửi con trỏ và tham chiếu thông qua mã mà không thể tạo lớp, xem bất kỳ dữ liệu nào trong lớp hoặc gọi bất kỳ phương thức nào của lớp.

has initializervẻ hơi không liên quan, nhưng đang nói rằng đối tượng không hoàn chỉnh đang được tạo ra.


7
Tôi tin bạn là bạn #include <fstream>, không phải#include <ifstream>
Alex Ryan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.