C ++: la variable 'std :: ifstream ifs' tiene inicializador pero tipo incompleto

139

Lo siento si esto es bastante novato, pero soy bastante nuevo en C ++. Estoy tratando de abrir un archivo y leerlo 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;
}

Sin embargo, recibo el siguiente error No estoy muy seguro de cómo solucionarlo:

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

Respuestas muy apreciadas. Tenga en cuenta que nunca lo olvidé #include <fstream>, ya que muchos han recibido el error simplemente por olvidar incluir el encabezado.

EDITAR:

Resulta que en realidad olvidé incluir fstream, pero lo había olvidado debido a que moví la función a otro archivo.

beakr
fuente
9
Lee el final de la pregunta. ;)
beakr
66
Esta respuesta me ayudó. En mi caso, fue porque eliminé otro archivo de encabezado que incluía fstream. La solución fue incluir fstream.
Andres Riofrio
12
Y no confundir con <iostream>. Solo <fstream>lo haremos.
Joachim W
9
Esta pregunta NO está demasiado localizada. Esto explicaba exactamente el problema que estaba teniendo.
Syndog
44
+1 para OP, incluida la respuesta. Me ayudó al fusionar el código de otro desarrollador que se creó con un proyecto obsoleto que no se me envió para la fusión. Claramente no demasiado localizado o estrecho.
Kenigmatic

Respuestas:

105

Esto parece ser respondido - #include <fstream>.

El mensaje significa: -

incomplete type- la clase no se ha definido con una clase completa. El compilador ha visto declaraciones como las class ifstream;que le permiten comprender que existe una clase, pero no sabe cuánta memoria ocupa la clase.

La declaración directa permite al compilador tener más sentido de: -

void BindInput( ifstream & inputChannel ); 

Entiende que la clase existe y puede enviar punteros y referencias a través del código sin poder crear la clase, ver ningún dato dentro de la clase o llamar a cualquier método de la clase.

El has initializerparece una extraña poco, pero está diciendo que se está creando el objeto incompleta.

mksteve
fuente
77
Estoy seguro de que querías decir #include <fstream>, no#include <ifstream>
Alex Ryan