Pytanie "Niepełny typ nie jest dozwolony" podczas tworzenia obiektów std :: ofstream


Visual Studio zgłasza ten dziwny błąd:

Niekompletny typ jest niedozwolony

Kiedy próbuję utworzyć obiekt std :: ofstream. Oto kod, który napisałem w funkcji.

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

za każdym razem, gdy ten program Visual Studio wyrzuci ten błąd. Dlaczego to się dzieje?


14
2018-03-05 16:23


pochodzenie


czy włączyłeś? <fstream>? - Mgetz


Odpowiedzi:


Jak mówi @Mgetz, prawdopodobnie zapomniałeś #include <fstream>.

Powód, dla którego nie dostałeś not declared błąd i zamiast tego incomplete type not allowed błąd ma związek z tym, co się dzieje, gdy istnieje typ "przekazano dalej", ale jeszcze nie w pełni zdefiniowane.

Spójrz na ten przykład:

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

Zauważ, że nie mogliśmy faktycznie utworzyć instancji obiektu Foo lub odesłać jego zawartości do po prawdziwa definicja. Gdy dostępna jest tylko deklaracja "do przodu", możemy mówić o niej tylko za pomocą wskaźnika lub odnośnika.

Prawdopodobnie dzieje się tak, że zawierasz nagłówek programu iostream, który zadeklarował forward std::ofstream w podobny sposób. Ale rzeczywista definicja std::ofstream jest w <fstream> nagłówek.


(Uwaga: w przyszłości pamiętaj, aby podać Minimalny, kompletny, weryfikowalny przykład zamiast jednej funkcji poza kodem. Powinieneś dostarczyć kompletny program demonstrujący problem. Byłoby lepiej, na przykład:

#include <iostream>

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

... również "Wyjście" jest generalnie postrzegane jako jedno pełne słowo, a nie dwa jako "OutPut")


23
2018-03-05 17:02