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, но я забыл из-за перемещения функции в другой файл.

beakr
источник
9
Прочитайте конец вопроса. ;)
beakr
6
Этот ответ помог мне. В моем случае это было потому, что я удалил другой заголовочный файл, который включал fstream. Решение было включить фстрим.
Андрес Риофрио
12
И не путайте с <iostream>. Только <fstream>сделаю.
Иоахим W
9
Этот вопрос не слишком локализован. Это точно объяснило проблему, с которой я столкнулся.
Syndog
4
+1 за ОП, включая ответ. Помог мне при слиянии кода другого разработчика, который был построен с устаревшими проектами, которые не были отправлены мне для слияния. Ясно, что не слишком локализован или узок.
Kenigmatic

Ответы:

105

Это, кажется, ответили #include <fstream>.

Сообщение означает: -

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

Форвардное объявление позволяет компилятору больше понимать:

void BindInput( ifstream & inputChannel ); 

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

has initializerКажется немного посторонним, но говорят о том , что неполный объект создаются.

mksteve
источник
7
Я уверен, что вы имели в виду #include <fstream>, нет#include <ifstream>
Алекс Райан