Größe des Scheiterns in der Vorlage, obwohl alle Typen definiert sind

8

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

    
Ronald Van Iwaarden 10.04.2015, 01:06
quelle

4 Antworten

6

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.

%Vor%

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.   

    
jxh 10.04.2015 01:51
quelle
1

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:

%Vor%

Je nachdem, was Ihre Anwendung ist, sollten Sie in der Lage sein, mit Eigenschaften zu tun, was Sie wollen.

    
Mokosha 10.04.2015 01:44
quelle
1

Wenn Sie pool innerhalb von functor deklarieren, definieren Sie immer noch die Klasse functor , daher ist der Typ functor immer noch unvollständig.

Dies ähnelt den Vorwärtsdeklarationen:

%Vor%     
fukanchik 10.04.2015 01:50
quelle
0

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.

    
Mark Lakata 10.04.2015 01:33
quelle

Tags und Links