web-dev-qa-db-ja.com

std :: ofstreamオブジェクトを作成するときの「不完全な型は許可されません」

Visual Studioはこの奇妙なエラーを投げます:

不完全なタイプは許可されません

Std :: ofstreamオブジェクトを作成しようとすると。これが関数内に書いたコードです。

void OutPutLog()
{
     std::ofstream outFile("Log.txt");
}

このVisual Studioが検出されるたびに、そのエラーがスローされます。なぜこれが起こるのか?

18
arun49 vs

@Mgetzが言うように、おそらく#include <fstream>を忘れていたでしょう。

not declaredエラーが発生せず、代わりにこのincomplete type not allowedエラーが発生したのは、 "forward declare" である型がある場合に何が起こるかと関係がありますが、まだ完全には定義されていません。

この例を見てください:

#include <iostream>

struct Foo; // "forward declaration" for a struct type

void OutputFoo(Foo & foo); // another "forward declaration", for a function

void OutputFooPointer(Foo * fooPointer) {
    // fooPointer->bar is unknown at this point...
    // we can still pass it by reference (not by value)
    OutputFoo(*fooPointer);
}

struct Foo { // actual definition of Foo
    int bar;
    Foo () : bar (10) {} 
};

void OutputFoo(Foo & foo) {
    // we can mention foo.bar here because it's after the actual definition
    std::cout << foo.bar;
}

int main() {
    Foo foo; // we can also instantiate after the definition (of course)
    OutputFooPointer(&foo);
}

実際の定義がafterになるまで、実際にFooオブジェクトをインスタンス化したり、その内容を参照したりできないことに注意してください。前方宣言のみを使用できる場合、ポインターまたは参照によってのみ宣言できます。

おそらく起こりそうなことは、同様の方法でstd::ofstreamを前方宣言したiostreamヘッダーを含めたことです。ただし、std::ofstreamの実際の定義は<fstream>ヘッダーにあります。


(注:将来的には、コードの関数を1つだけではなく、 最小、完全、検証可能な例 を提供するようにしてください。問題を示しています。たとえば、これはもっと良かったでしょう:

#include <iostream>

int main() {
    std::ofstream outFile("Log.txt");
}

...また、「出力」は一般に「OutPut」としての2つではなく、1つの完全なWordと見なされます)

40
HostileFork