Kein Typ mit dem Namen "type" in der CTRP-abgeleiteten Klasse

8

Ich experimentierte mit dem Seltsam wiederkehrenden Template-Muster für ein generisches Einzelargument Funktor und habe zwei Implementierungen: eine, die einen Template-Template-Parameter verwendet, der funktioniert, und eine zweite, wo ich versuche, auf den abgeleiteten Functor :: -Typ in der Interface-Klasse zuzugreifen. Im letzteren Beispiel meldet der Compiler (gcc 5.4.0)

  

Fehler : Kein Typ namens ' type ' in 'struct Cube & lt; Doppel & gt; '

%Vor%

Ich versuche dann mit T = double in main () der folgenden zwei Klassen zu kompilieren:

%Vor%

Kann das FunctorInterface_2 / Cube-Beispiel geändert werden, um zu funktionieren, oder ist es notwendig, dass die Interface-Klasse auf T als Templates erstellt wird im ersten Beispiel? Danke!

BEARBEITEN: Mit gcc -std = c ++ 14 kann ich das zweite Beispiel kompilieren und ausführen Mit AutoReturn und Argumenttypen in FunctorInterface_1 :: operator (), wie ich jedoch verstehe, sind automatische Argumenttypen nicht Teil des C ++ 14-Standards.

EDIT 2: Nun, ich fühle mich ein bisschen dick. Ich habe gerade erkannt, dass ich FunctorInterface_1 :: operator () auf einen neuen Parameter abbilden könnte, aber für die Anwendung, die ich im Hinterkopf habe, möchte ich wirklich, dass meine Basisklasse auf Typen zugreifen kann, die in der abgeleiteten Klasse definiert sind.

    
Greg von Winckel 21.08.2017, 16:18
quelle

3 Antworten

4

Wenn die Zeile

%Vor%

wird in der Basisklasse verarbeitet, die Definition von Functor ist nicht verfügbar. Daher können Sie Functor::type nicht verwenden.

Eine Möglichkeit, diese Einschränkung zu umgehen, besteht darin, eine Merkmalsklasse zu definieren.

%Vor%

Arbeitscode: Ссылка

    
R Sahu 21.08.2017, 16:32
quelle
2

Ihr Code könnte zu

vereinfacht werden %Vor%

Es funktioniert nicht, da an der Stelle von Base instanziation Derived -Klasse nicht vollständig ist und der Compiler noch nicht von Derived::type Existenz weiß.

    
VTT 21.08.2017 16:32
quelle
1

Sie müssen verstehen, dass bei der Instanziierung von Cube<T> FunctionInterface_2<Cube<T>> zuerst instanziiert wird. Dies bedeutet, dass Cube<T> ein unvollständiger Typ ist, während dies geschieht.
Wenn also der Compiler mit% co_de zu der Zeile gelangt, ist% Ftype = typename Functor::type; unvollständig und Sie können nicht auf einen seiner verschachtelten Typen zugreifen.

In Ihrem Fall können Sie Functor zu:

ändern %Vor%

Nun wird der Zugriff auf Informationen über FunctionInterface_2 verzögert, bis Sie Functor von operator() aufrufen, wobei FunctionInterface_2 und FunctionInterface_2 vollständig instanziiert sind.

    
SirGuy 21.08.2017 16:40
quelle