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)
%Vor%Fehler : Kein Typ namens ' type ' in 'struct Cube & lt; Doppel & gt; '
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.
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: Ссылка
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:
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.
Tags und Links c++ templates non-virtual-interface