Es scheint nicht möglich zu sein, einen Verweis auf die Basisklasse Objekt eines abgeleiteten Objekts als Template-Parameter übergeben, wie ich versuche, hier zu tun:nicht-type template-Parameter: wie Verweis auf Basisklassenobjekt übergeben?
struct a
{ int _v;
constexpr a():_v(0){}
constexpr a(int v): _v(v){}
};
struct c: public a
{ constexpr c():a(){}
constexpr c(int v):a(v){}
};
extern const c default_a;
constexpr const c default_a { 1 };
const a& c_as_a = default_a;
// ^-- this line (16) causes no error - c can be converted to a
template < const a & The_A = default_a >
struct b
{ constexpr static const a &the_a = The_A;
};
b<> a_b;
// Template instantiation causes error:
// t.C:24:7: error: could not convert template argument 'default_a' to 'const a&'
// b<> a_b;
// ^
ich die ‚c erwartet hätte 'Objekt ‚default_a‘, da es aus abgeleitet ist ‚a‘, akzeptabel zu sein als ‚eine & const‘, wie es auf der Linie 16.
Warum ist das nicht OK als Template-Parameter?
Welcher Abschnitt der Spezifikation schreibt dieses Verhalten eigentlich vor?
Vielleicht ist mein Build von gcc-5.3.0 irgendwie defekt?
Jemand gefunden eine gute Problemumgehung/Möglichkeit der Übergabe eines abgeleiteten Objekts als Referenz-Vorlage-Parameter des Basisklassenobjekts?
template < const a & The_A = c_as_a >
tC:: 24: 7: Fehler: 'const ein & c_as_a' ist keine gültige Vorlage
Ich kann für 'default_a' in Template-Argument-Liste nicht nur die Bezugsgröße 'c_as_a' ersetzen Argument für Typ 'const a &', weil eine Referenzvariable keine konstante Adresse hat b <> a_b;
Ich kann auch nicht jeden constexpr Funktionsaufruf ersetzen, die wie etwas tut:
constexpr const a& c_as_a(const c &c){ return *reinterpret_cast<const a*>(&c);}
...
template < const a & The_A = c_as_a(default_a) >
da dieser Aufruf kein ‚Objekt mit externer Bindung‘ ist.
Alle Vorschläge, wie man einen Verweis auf eine Basisklasse eines abgeleiteten Objekts als Template-Parameter übergeben würde sehr geschätzt - es ist hat möglich sein, ich kann einfach nicht sehen, wie ATM.
Es muss eine Möglichkeit geben, einen Verweis auf das Basisklassenobjekt eines Objekts als Vorlagenparameter anzugeben.
in C++ 14 der nicht-Typ Template-Parameter 'const a &' nur direkt an einen benannten lvalue mit Bindung binden kann. Du hast also kein Glück. In C++ 17 wird es erlaubt, an einige weitere Dinge zu binden, [siehe hier] (http://en.cppreference.com/w/cpp/language/template_parameters) –
Danke MM - Entschuldigung für die erste 'The_A = c Tippfehler - jetzt korrigiert. – JVD
OK, danke für die Bestätigung, was ich vermutet habe. – JVD