2015-03-05 13 views
9

Visual Studio Ném Lỗi lạ này:"loại không đầy đủ không được phép" khi tạo std :: ofstream đối tượng

Incomplete type not allowed

Khi tôi cố gắng tạo ra một đối tượng std :: ofstream. Đây là mã tôi đã viết bên trong một hàm.

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

bất cứ khi nào nó gặp Visual Studio này ném lỗi đó. Tại sao điều này xảy ra?

+14

bạn đã bao gồm ' '? – Mgetz

Trả lời

17

Như @Mgetz nói, có thể bạn đã quên #include <fstream>.

Lý do bạn không nhận được lỗi not declared và thay vào đó lỗi incomplete type not allowed này liên quan đến những gì xảy ra khi có loại "forward declared" nhưng chưa được xác định đầy đủ.

Nhìn vào ví dụ này:

#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); 
} 

Chú ý chúng ta có thể không thực sự tạo một đối tượng Foo hoặc tham khảo nội dung của nó cho đến khi sau định nghĩa thực sự. Khi chúng tôi chỉ có tờ khai chuyển tiếp có sẵn, chúng tôi chỉ có thể nói về nó bằng con trỏ hoặc tham chiếu.

Điều có thể xảy ra là bạn đã bao gồm một số tiêu đề iostream đã được tuyên bố trước std::ofstream theo cách tương tự. Nhưng định nghĩa thực tế của std::ofstream nằm trong tiêu đề <fstream>.


(Lưu ý:.. Trong tương lai hãy chắc chắn để cung cấp một Minimal, Complete, Verifiable Example thay vì chỉ một chức năng ra khỏi mã của bạn Bạn nên cung cấp một chương trình hoàn chỉnh chứng tỏ vấn đề này sẽ tốt hơn, ví dụ:

#include <iostream> 

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

... cũng có, "Output" thường được xem như là một từ hoàn chỉnh, chứ không phải hai như "đầu ra")

Các vấn đề liên quan