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.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage