C++: variable 'std::ifstream ifs' has initializer but incomplete type
Asked Answered
C

1

190

Sorry if this is pretty noobish, but I'm pretty new to C++. I'm trying to open a file and read it using 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;
}

However, I'm getting the following error I'm not quite sure how to fix:

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

Answers very appreciated. Note that I never forgot to #include <fstream>, since many have gotten the error due to just forgetting to include the header.

EDIT:

Turns out that I actually did forget to include fstream, but I had forgotten due to moving the function to another file.

Calceiform answered 26/2, 2013 at 2:17 Comment(6)
This answer helped me. In my case, it was because I removed another header file that included fstream. Solution was to include fstream.Argile
And don't confuse with <iostream>. Only <fstream> will do.Annapolis
This question is NOT too localized. This explained exactly the problem I was having.Danforth
+1 for OP including the answer. Helped me when merging another dev's code that was built with stale project includes not sent to me for the merge. Clearly not too localized or narrow.Hacker
Possible duplicate of Infile incomplete type errorRia
I also ran into this after removing a different header. Thanks!Lorenalorene
E
165

This seems to be answered - #include <fstream>.

The message means :-

incomplete type - the class has not been defined with a full class. The compiler has seen statements such as class ifstream; which allow it to understand that a class exists, but does not know how much memory the class takes up.

The forward declaration allows the compiler to make more sense of :-

void BindInput( ifstream & inputChannel ); 

It understands the class exists, and can send pointers and references through code without being able to create the class, see any data within the class, or call any methods of the class.

The has initializer seems a bit extraneous, but is saying that the incomplete object is being created.

Entwine answered 18/9, 2015 at 14:26 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.