Die Auswirkungen von virtual auf die Verwendung von Vorlagen für Klassenmitglieder
Ich weiß (vage), dass eine Vorlage nicht instanziiert wird, wenn dies der Fall istnicht gebraucht. Der folgende Code wird beispielsweise problemlos kompiliert, obwohlT::type
macht keinen Sinn, wennT = int
.
template<typename T>
struct A
{
void f() { using type = typename T::type; }
};
A<int> a; //ok
Es kompiliert weilf()
ist nichtgebrauchtEs wird also nicht instanziiert - also die Gültigkeit vonT::type
bleibt deaktiviert. Es ist egal, ob jemand anderesMitglied Funktiong()
Anrufef()
.
template<typename T>
struct A
{
void f() { using type = typename T::type; }
void g() { f(); } //Is f() still unused?
};
A<int> a; //ok
Das auchBußgelder zusammenstellen. Aber hier erkenne ich die Unbestimmtheit in meinem Verständnis der Definition von"benutzen". Ich frage:
Istf()
noch unbenutzt? Wie genau?Ich kann deutlich sehen, dass es im Inneren verwendet wirdg()
. Aber dann dachte ich dag()
ist nicht benutzt,f()
wird auch aus der Sicht der Instanziierung nicht verwendet. Das scheint vernünftig zu sein. bisher.
Jedoch wenn ich hinzufügevirtual
Schlüsselwort zug()
, es kompiliert nicht:
template<typename T>
struct A
{
void f() { using type = typename T::type; }
virtual void g() { f(); } //Now f() is used? How exactly?
};
A<int> a; //error
Es fuehrt zuKompilierungsfehler denn jetzt versucht es zu instanziierenf()
. Ich verstehe dieses Verhalten nicht.
Kann das jemand erklären? Vor allem die Auswirkungen vonvirtual
Schlüsselwort für die Definition der "Verwendung" des Mitglieds der Klassenvorlage.