C ++: zmienna „std :: ifstream ifs” ma inicjator, ale niekompletny typ

139

Przepraszam, jeśli to dość nieładne, ale jestem całkiem nowy w C ++. Próbuję otworzyć plik i przeczytać go za pomocą 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;
}

Jednak pojawia się następujący błąd, nie jestem pewien, jak to naprawić:

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

Odpowiedzi bardzo cenione. Zauważ, że nigdy nie zapomniałem o tym #include <fstream>, ponieważ wiele osób otrzymało błąd, ponieważ po prostu zapomniałem dołączyć nagłówek.

EDYTOWAĆ:

Okazuje się, że właściwie zapomniałem o dołączeniu fstream, ale zapomniałem o przeniesieniu funkcji do innego pliku.

beakr
źródło
9
Przeczytaj koniec pytania. ;)
beakr
6
Ta odpowiedź mi pomogła. W moim przypadku było tak, ponieważ usunąłem inny plik nagłówkowy, który zawierał fstream. Rozwiązaniem było włączenie fstream.
Andres Riofrio
12
I nie mylić z <iostream>. Tylko się <fstream>nada.
Joachim W
9
To pytanie NIE jest zbyt zlokalizowane. To dokładnie wyjaśniało problem, który miałem.
Syndog,
4
+1 za OP, w tym odpowiedź. Pomogło mi przy scalaniu kodu innego dewelopera, który został zbudowany z nieaktualnego projektu, który nie został wysłany do mnie w celu scalenia. Najwyraźniej niezbyt zlokalizowane lub wąskie.
Kenigmatic

Odpowiedzi:

105

Wydaje się, że odpowiedź - #include <fstream>.

Wiadomość oznacza: -

incomplete type- klasa nie została zdefiniowana z pełną klasą. Kompilator widział takie instrukcje, class ifstream;które pozwalają mu zrozumieć, że klasa istnieje, ale nie wie, ile pamięci zajmuje ta klasa.

Deklaracja forward umożliwia kompilatorowi zrozumienie: -

void BindInput( ifstream & inputChannel ); 

Rozumie, że klasa istnieje i może wysyłać wskaźniki i referencje za pośrednictwem kodu bez możliwości tworzenia klasy, przeglądania danych w klasie lub wywoływania metod tej klasy.

has initializerWydaje się nieco obce, ale mówi, że niekompletny obiekt jest tworzony.

mksteve
źródło
7
Jestem pewien, że miałeś na myśli #include <fstream>, że nie#include <ifstream>
Alex Ryan