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.