Visual Studioはこの奇妙なエラーを投げます:
不完全なタイプは許可されません
Std :: ofstreamオブジェクトを作成しようとすると。これが関数内に書いたコードです。
void OutPutLog()
{
std::ofstream outFile("Log.txt");
}
このVisual Studioが検出されるたびに、そのエラーがスローされます。なぜこれが起こるのか?
@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と見なされます)