C ++: variável 'std :: ifstream ifs' tem inicializador, mas tipo incompleto

139

Desculpe se isso é bastante noobish, mas eu sou muito novo em C ++. Estou tentando abrir um arquivo e lê-lo usando 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;
}

No entanto, estou recebendo o seguinte erro: não tenho certeza de como corrigir:

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

Respostas muito apreciadas. Note que nunca esqueci #include <fstream>, pois muitos obtiveram o erro devido ao esquecimento de incluir o cabeçalho.

EDITAR:

Acontece que eu realmente esqueci de incluir fstream, mas esqueci devido a mover a função para outro arquivo.

beakr
fonte
9
Leia o final da pergunta. ;)
beakr 26/02
6
Essa resposta me ajudou. No meu caso, foi porque removi outro arquivo de cabeçalho que incluía o fstream. A solução foi incluir fstream.
Andres Riofrio 25/05
12
E não confunda com <iostream>. Só <fstream>vai fazer.
Joachim W
9
Esta pergunta NÃO é muito localizada. Isso explicava exatamente o problema que eu estava tendo.
Syndog
4
+1 para OP, incluindo a resposta. Ajudou-me a mesclar o código de outro desenvolvedor que foi criado com o projeto obsoleto e não me foi enviado para a mesclagem. Claramente não muito localizado ou estreito.
Kenigmatic

Respostas:

105

Isso parece ter sido respondido - #include <fstream>.

A mensagem significa: -

incomplete type- a classe não foi definida com uma classe completa. O compilador viu declarações como as class ifstream;que permitem entender que uma classe existe, mas não sabe quanta memória a classe ocupa.

A declaração direta permite que o compilador compreenda melhor:

void BindInput( ifstream & inputChannel ); 

Ele entende que a classe existe e pode enviar ponteiros e referências através do código sem poder criar a classe, ver quaisquer dados dentro da classe ou chamar qualquer método da classe.

O has initializerparece um estranho pouco, mas está dizendo que o objeto incompleta está sendo criado.

mksteve
fonte
7
Estou confiante de que você quis dizer #include <fstream>, não#include <ifstream>
Alex Ryan