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.


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.


77
Estoy seguro de que querías decir #include <fstream>, no#include <ifstream>
Alex Ryan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.