delegating constructor curiosity
-
Mir ist eben gerade beim Verwenden von Konstruktorweiterleitungen etwas aufgefallen.
Und zwar geht es um das "Problem", dass man nur an die direkte Basisklasse weitergeben kann. Bei einem Klassentemplate, erhielt ich jedoch keine Beschwerde.
Weiteres kann aus den Kommentaren entnommen werden.Hier der reduzierte Code:
class NTBase { private: int param_; public: NTBase(int param) :param_(param) {} }; template <typename Derived> class Base : public NTBase { public: using something = Derived; Base(int param) :NTBase(param) {} }; template <typename T> class A : public Base <A<T>> { public: A(int param) //: Base<A<T>>(param) // funktioniert //: Base<A>(param) // funktioniert auch (habe ich NICHT erwartet) : NTBase(param) // funktioniert auch - Erwarteter Fehler siehe unten in B <- MEIN KNACKPUNKT //: Base(param) // funktioniert nicht (habe ich erwartet) {} }; class B : public Base <B> { public: B(int param) : Base(param) // funktioniert (habe ich nicht erwartet) : Base<B>(param) // funktioniert auch //: NTBase(param) // error: type 'NTBase' is not a direct or virtual base of 'B' (wie erwartet) {} };Ist das Compilerverhalten wirklich so korrekt?
EDIT: naja g++ und clang können sich ja wohl nicht beide irren

-
Der erwartete Fehler kommt auch - und zwar dann wenn du versuchst die Klasse wirklich zu instanzieren.
Templates solle man immer erstmal instanzieren bevor man einfach davon ausgeht dass alles passt.
-
//: Base<A>(param) // funktioniert auch (habe ich NICHT erwartet)Aist der injected-class-name und ist equivalent zur Spezialisierung die gerade instantiiert wird (alsoA<T>).//: Base(param) // funktioniert (habe ich nicht erwartet)Dasselbe gilt für
Base- der injected-class-name wird fürBaseinBase' Scope eingeführt, sodass du ihn als Typen verwenden kannst - auch in abgeleiteten Klassen (die nach Namen schließlich auch in Scopes von Basisklassen suchen).: NTBase(param) // funktioniert auch - Erwarteter Fehler siehe unten in B <- MEIN KNACKPUNKTWas heißt "funktioniert"? Wie hast du das getestet?
-
hustbaer schrieb:
Der erwartete Fehler kommt auch - und zwar dann wenn du versuchst die Klasse wirklich zu instanzieren.
Templates solle man immer erstmal instanzieren bevor man einfach davon ausgeht dass alles passt.Hmmm, da war ich wohl zu schnell im Forum

Arcoth schrieb:
//: Base<A>(param) // funktioniert auch (habe ich NICHT erwartet)Aist der injected-class-name und ist equivalent zur Spezialisierung die gerade instantiiert wird (alsoA<T>).//: Base(param) // funktioniert (habe ich nicht erwartet)Dasselbe gilt für
Base- der injected-class-name wird fürBaseinBase' Scope eingeführt, sodass du ihn als Typen verwenden kannst - auch in abgeleiteten Klassen (die nach Namen schließlich auch in Scopes von Basisklassen suchen).japp und damit wäre dann alles geklärt.