web-dev-qa-db-fra.com

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

Désolé si c'est assez noobish, mais je suis assez nouveau en C++. J'essaie d'ouvrir un fichier et de le lire avec 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, je reçois le message d'erreur suivant et je ne sais pas trop comment le réparer:

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

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

EDIT:

Il s'avère que j'ai effectivement oublié d'inclure fstream, mais j'avais oublié à cause du déplacement de la fonction dans un autre fichier.

121
beakr

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 elle 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 par le biais du code sans pouvoir créer la classe, voir les données de la classe ou appeler les méthodes de la classe.

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

77
mksteve