web-dev-qa-db-fra.com

"Type incomplet non autorisé" lors de la création d'objets std :: ofstream

Visual Studio lève cette étrange erreur:

Type incomplet non autorisé

Lorsque j'essaie de créer un objet std :: ofstream. Voici le code que j'ai écrit dans une fonction.

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

chaque fois qu'il rencontre ce Visual Studio lève cette erreur. Pourquoi cela se produit-il?

18
arun49 vs

Comme le dit @Mgetz, vous avez probablement oublié de #include <fstream>.

La raison pour laquelle vous n'avez pas reçu de not declared erreur et à la place ce incomplete type not allowed L'erreur a à voir avec ce qui se passe quand il y a un type qui a été "forward déclaré" , mais pas encore complètement défini.

Regardez cet exemple:

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

Notez que nous ne pouvions pas réellement instancier un objet Foo ou référencer son contenu jusqu'à après la vraie définition. Lorsque nous ne disposons que de la déclaration directe, nous ne pouvons en parler que par pointeur ou référence.

Ce qui se passe probablement, c'est que vous avez inclus un en-tête iostream qui avait déclaré _ std::ofstream d'une manière similaire. Mais la définition réelle de std::ofstream est dans le <fstream> entête.


(Remarque: à l'avenir, assurez-vous de fournir un exemple minimal, complet et vérifiable au lieu d'une seule fonction de votre code. Vous devez fournir un programme complet qui illustre le problème. Cela aurait été mieux, par exemple:

#include <iostream>

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

... aussi, "Output" est généralement considéré comme un mot complet, et non deux comme "OutPut")

40
HostileFork