C ++: Die Variable 'std :: ifstream ifs' hat einen Initialisierer, aber einen unvollständigen Typ

138

Tut mir leid, wenn das ziemlich noobisch ist, aber ich bin ziemlich neu in C ++. Ich versuche, eine Datei zu öffnen und zu lesen, indem ich 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;
}

Ich erhalte jedoch den folgenden Fehler. Ich bin mir nicht ganz sicher, wie ich ihn beheben soll:

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

Antworten sehr geschätzt. Beachten Sie, dass ich es nie vergessen habe #include <fstream>, da viele den Fehler erhalten haben, weil sie einfach vergessen haben, den Header einzuschließen.

BEARBEITEN:

Es stellte sich heraus, dass ich das Einfügen tatsächlich vergessen hatte fstream, aber ich hatte es vergessen, weil ich die Funktion in eine andere Datei verschoben hatte.

beakr
quelle
9
Lesen Sie das Ende der Frage. ;)
beakr
6
Diese Antwort hat mir geholfen. In meinem Fall lag es daran, dass ich eine andere Header-Datei entfernt habe, die fstream enthielt. Die Lösung bestand darin, fstream einzuschließen.
Andres Riofrio
12
Und nicht verwechseln mit <iostream>. Nur reicht <fstream>.
Joachim W
9
Diese Frage ist NICHT zu lokalisiert. Dies erklärte genau das Problem, das ich hatte.
Syndog
4
+1 für OP einschließlich der Antwort. Hat mir beim Zusammenführen des Codes eines anderen Entwicklers geholfen, der mit veralteten Projekt-Includes erstellt wurde, die mir nicht zum Zusammenführen gesendet wurden. Offensichtlich nicht zu lokalisiert oder eng.
Kenigmatic

Antworten:

104

Dies scheint beantwortet zu sein - #include <fstream>.

Die Nachricht bedeutet: -

incomplete type- Die Klasse wurde nicht mit einer vollständigen Klasse definiert. Der Compiler hat Anweisungen gesehen, mit class ifstream;denen er verstehen kann, dass eine Klasse vorhanden ist, weiß jedoch nicht, wie viel Speicher die Klasse belegt.

Die Vorwärtsdeklaration ermöglicht es dem Compiler, Folgendes zu verstehen:

void BindInput( ifstream & inputChannel ); 

Es versteht, dass die Klasse vorhanden ist, und kann Zeiger und Referenzen über Code senden, ohne die Klasse erstellen, Daten innerhalb der Klasse anzeigen oder Methoden der Klasse aufrufen zu können.

Das has initializerscheint etwas irrelevant, sagt aber, dass das unvollständige Objekt erstellt wird.

mksteve
quelle
7
Ich bin zuversichtlich, Sie meinten #include <fstream>, nicht#include <ifstream>
Alex Ryan