Ошибка в компиляторе VC7
От: danikin  
Дата: 30.03.05 08:40
Оценка: 21 (1) +1

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.")
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.