Wpływ wirtualnego na użycie szablonu członka klasy

Ja (niejasno) wiem, że szablon nie jest tworzony, jeśli tak jestnie używany. Na przykład poniższy kod będzie się dobrze kompilowałT::type nie ma sensu, kiedyT = int.

template<typename T>
struct A
{
    void f() { using type = typename T::type; }
};

A<int> a; //ok

Kompiluje, ponieważf() nie jestużywany, więc nie jest instancji - stąd ważnośćT::type pozostaje niezaznaczone. To nie ma znaczenia, jeśli jakieś inneczłonek funkcjonowaćg() połączeniaf().

template<typename T>
struct A
{
    void f() { using type = typename T::type; }

    void g() { f(); } //Is f() still unused?
};

A<int> a; //ok

To takżeskompilować grzywny. Ale tutaj zdaję sobie sprawę z niejasności w rozumieniu definicji"posługiwać się". Pytam:

Jestf() wciąż nieużywany? Jak dokładnie?

Widzę wyraźnie, że jest używany wewnątrzg(). Ale potem pomyślałemg() nie jest używany,f() nie jest również używany z punktu widzenia instancji. To wydaje się wystarczająco rozsądne. jak dotąd.

Jeśli jednak dodamvirtual słowo kluczowe dog(), nie kompiluje:

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

To powodujebłąd kompilacji ponieważ teraz próbuje utworzyć instancjęf(). Nie rozumiem tego zachowania.

Czy ktoś mógłby to wyjaśnić? Zwłaszcza wpływvirtual słowo kluczowe w definicji „użycia” członka szablonu klasy.

questionAnswers(1)

yourAnswerToTheQuestion