Ok, ich arbeite mit g ++ 4.8.2 und habe den folgenden (etwas langen) Code, der eine Fehlermeldung über einen unvollständigen Typ bekommt. Ich habe den Code auf ein kleineres Stück für die Aufnahme hier reduziert und kann direkt kompiliert werden:
%Vor%Die Compiler-Fehlermeldung lautet:
%Vor%Offensichtlich ist der Template-Funktor oben definiert und alle Argumente für funktor wurden explizit definiert. Dies scheint mir zu implizieren, dass die Größe der Funktion gut definiert sein sollte. Gibt es etwas, das mir hier fehlt?
- Ron
Das Problem besteht darin, dass der Compiler versucht, mempool<>
zu instanziieren, bevor es functor<>
instanziiert. Dies liegt daran, dass der Compiler das statische Element functor<>::pool
zuerst definieren muss, bevor functor<>
selbst als vollständig definiert gilt.
Eine Problemumgehung besteht darin, ein mempool<> &
von einer statischen Elementfunktion zurückzugeben.
Das funktioniert, weil die Referenz bedeutet, dass mempool<>
unvollständig bleibt, bis functor<>
instanziiert wurde. (Tatsächlich wird eine Methode einer Vorlage nicht instanziiert, es sei denn, es gibt Code, der sie aufruft.) Wenn die statische Methode aufgerufen wird, ist functor<>
selbst abgeschlossen, sodass das statische Objekt in functor<>::get_pool
richtig instanziiert werden kann.
Als Randnotiz ist es akzeptabel, einen unvollständigen Typ als Argument an eine Vorlage zu übergeben, aber die Vorlage hat Einschränkungen, was sie tatsächlich mit einem unvollständigen Typ tun kann. Alles ist in Ordnung, wenn die Vorlage nur eine Referenz oder einen Zeiger auf den Typ für die Instanziierung benötigt.
Ihre Definition von functor
ist rekursiv. Der Compiler muss die Größe des Typs functor
kennen, während er den Typ functor
festlegt. Sie können genau das gleiche Problem mit diesem Code erzeugen:
Je nachdem, was Ihre Anwendung ist, sollten Sie in der Lage sein, mit Eigenschaften zu tun, was Sie wollen.
Ich glaube nicht, dass Sie das können, weil Sie eine rekursive Definition haben. Zum Beispiel können Sie dies nicht tun:
%Vor%Der einzige Ausweg besteht darin, eines der Elemente zu einem Zeiger anstelle einer Instanz zu machen.