168 votes

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

Désolé si c'est un peu nébuleux, mais je suis assez novice en matière de C++. J'essaie d'ouvrir un fichier et de le lire à l'aide de 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

Les réponses sont très appréciées. Notez que je n'ai jamais oublié de #include <fstream> car de nombreuses personnes ont obtenu l'erreur en oubliant simplement d'inclure l'en-tête.

EDIT :

Il s'avère que j'ai en fait oublié d'inclure fstream mais j'avais oublié en déplaçant la fonction dans un autre fichier.

145voto

mksteve Points 3337

Il semble y avoir une réponse à cette question - #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 déclarations telles que class ifstream; qui lui permettent de comprendre qu'une classe existe, mais ne sait pas combien de mémoire la classe occupe.

La déclaration forward permet au compilateur de mieux comprendre :-.

void BindInput( ifstream & inputChannel ); 

Il comprend que la classe existe et peut envoyer des pointeurs et des références à travers le code sans être capable de créer la classe, de voir les données de la classe ou d'appeler les méthodes de la classe.

El has initializer semble un peu superflu, mais indique que l'objet incomplet est en cours de création.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X