template <typename T>
class Base { virtual ~Base() {} };
template <typename T>
class Derived : public Base<T> { };
Base<int> *pb;
void f()
{
cout << "f(): " << typeid(*pb).name() << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
pb = new Derived<int>;
cout << "main(): " << typeid(*pb).name() << endl;
f();
cout << "main(): " << typeid(*pb).name() << endl;
return 0;
}
Эта программа у меня выводит на экран следующее:
main(): class Derived<int>
f(): class Base<int>
main(): class Derived<int>
Причем, если после
Base<int> *pb;
поместить строчку,
template Base<int>;
то вывод уже правильный:
main(): class Derived<int>
f(): class Derived<int>
main(): class Derived<int>
Таким образом, компилятор не производит неявное инстанцирование Base<int>, хотя должен (см. стандарт (14.7.1): "... completeness of the class type affects the semantics of the program.")