web-dev-qa-db-ja.com

C ++:変数 'std :: ifstream ifs'には初期化子がありますが、型が不完全です

これがかなり初心者の方には申し訳ありませんが、私はC++が初めてです。ファイルを開いて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;
}

ただし、次のエラーが表示されます。修正方法はわかりません。

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

回答は大歓迎です。 #include <fstream>を忘れたことはないことに注意してください。多くの人がヘッダーをインクルードするのを忘れているためにエラーを受け取っているからです。

編集:

fstreamを含めることを実際に忘れていましたが、関数を別のファイルに移動したため忘れていました。

115
beakr

これは答えられているようです-#include <fstream>

メッセージの意味は:-

incomplete type-クラスは完全なクラスで定義されていません。コンパイラーは、クラスが存在することを理解できるようにするclass ifstream;などのステートメントを見てきましたが、クラスが占有するメモリー量を知りません。

前方宣言により、コンパイラは次のことを理解できます。

void BindInput( ifstream & inputChannel ); 

クラスの存在を理解し、クラスを作成したり、クラス内のデータを参照したり、クラスのメソッドを呼び出したりすることなく、コードを介してポインターと参照を送信できます。

has initializerは少し無関係のようですが、不完全なオブジェクトが作成されていると言っています。

72
mksteve