C ++: змінна 'std :: ifstream ifs' має ініціалізатор, але неповний тип


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.
Андрес Ріофріо

12
І не плутати з <iostream>. Тільки <fstream>зроблять.
Йоахім

9
Це питання НЕ занадто локалізовано. Це саме пояснило проблему, з якою я мав місце.
Syndog

4
+1 для ОП, включаючи відповідь. Допоміг мені при об'єднанні іншого коду розробника, який був побудований з усталеним проектом, що не надсилається мені для об'єднання. Очевидно не занадто локалізовано або вузько.
Кенігматик

Відповіді:


105

На це, здається, відповіли - #include <fstream>.

Повідомлення означає: -

incomplete type- клас не визначено з повним класом. Компілятор бачив такі заяви, class ifstream;які дозволяють йому зрозуміти, що клас існує, але не знає, скільки пам'яті займає клас.

Попередня декларація дозволяє компілятору мати більше сенсу:

void BindInput( ifstream & inputChannel ); 

Він розуміє, що клас існує, і може надсилати вказівники та посилання через код, не маючи змоги створити клас, побачити будь-які дані в класі або викликати будь-які методи класу.

has initializerЗдається трохи стороннім, але кажуть про те , що неповний об'єкт створюються.


7
Впевнений, ви мали на увазі #include <fstream>, що не#include <ifstream>
Алекс Райан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.