Visual Studio引发此奇怪错误:
不允许不完整的类型
当我尝试创建一个std :: ofstream对象时。这是我在函数中编写的代码。
void OutPutLog()
{
std::ofstream outFile("Log.txt");
}
每当遇到此Visual Studio时都会抛出该错误。为什么会发生这种情况?
答案 0 :(得分:37)
正如@Mgetz所说,你可能忘了#include <fstream>
。
您没有收到not declared
错误的原因,而是incomplete type not allowed
错误与有"forward declared"类型但尚未完全发生的情况有关定义
看看这个例子:
#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);
}
注意我们实际上无法实例化Foo对象或引用其内容,直到之后真正的定义。当我们只提供前瞻性声明时,我们可能只会通过指针或参考来讨论它。
可能发生的事情是你以类似的方式包含了一些前向声明std::ofstream
的iostream标头。但std::ofstream
的实际定义位于<fstream>
标题中。
(注意:将来一定要提供一个Minimal, Complete, Verifiable Example而不是代码中的一个函数。你应该提供一个完整的程序来演示这个问题。这本来会更好,因为实例
#include <iostream>
int main() {
std::ofstream outFile("Log.txt");
}
...另外,“输出”通常被视为一个完整的单词,而不是两个作为“OutPut”)