C ++: la variable 'std :: ifstream ifs' a un initialiseur mais un type incomplet

139

Désolé si c'est assez noobish, mais je suis assez nouveau en C ++. J'essaye d'ouvrir un fichier et de le lire en utilisant 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;
}

Cependant, j'obtiens l'erreur suivante que je ne sais pas trop comment résoudre:

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

Réponses très appréciées. Notez que je n'ai jamais oublié de le faire #include <fstream>, car beaucoup ont eu l'erreur en oubliant simplement d'inclure l'en-tête.

ÉDITER:

Il s'avère que j'ai en fait oublié d'inclure fstream, mais j'avais oublié en raison du déplacement de la fonction vers un autre fichier.

bec
la source
9
Lisez la fin de la question. ;)
beakr
6
Cette réponse m'a aidé. Dans mon cas, c'était parce que j'ai supprimé un autre fichier d'en-tête qui incluait fstream. La solution consistait à inclure fstream.
Andres Riofrio
12
Et ne confondez pas avec <iostream>. Seul <fstream>fera l'affaire.
Joachim W
9
Cette question n'est PAS trop localisée. Cela expliquait exactement le problème que j'avais.
Syndog
4
+1 pour OP avec la réponse. M'a aidé lors de la fusion du code d'un autre développeur qui a été construit avec des projets obsolètes qui ne m'ont pas été envoyés pour la fusion. Clairement pas trop localisé ou étroit.
Kenigmatic

Réponses:

105

Cela semble être répondu - #include <fstream>.

Le message signifie: -

incomplete type- la classe n'a pas été définie avec une classe complète. Le compilateur a vu des instructions telles que class ifstream;qui lui permettent de comprendre qu'une classe existe, mais ne sait pas combien de mémoire la classe prend.

La déclaration forward permet au compilateur de donner plus de sens à: -

void BindInput( ifstream & inputChannel ); 

Il comprend que la classe existe et peut envoyer des pointeurs et des références via du code sans pouvoir créer la classe, voir les données de la classe ou appeler des méthodes de la classe.

Le has initializersemble un peu étranger, mais il dit que l'objet incomplet est en cours de création.

mksteve
la source
7
Je suis sûr que vous vouliez dire #include <fstream>, non#include <ifstream>
Alex Ryan