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.")
[skip]
Думаю, все-таки в pb лежит правильный объект (в смысле Derived<int>), а вот typeid косячит. Если на это не полагаться, тогда жить можно. Виртуальные функции вызываются как надо. В смысле
main(): class Derived<int>
!!
f(): class Derived<int>
main(): class Derived<int>
Как ему и положено. Если вызов виртуальной функции грохнуть, тогда лажа. Думаю, все же это не совсем глюк. Что-то кажется было про typeid и виртуальные функции...
Вообще говоря, VC7 не единственный, кто глючит. icc 7.1 тоже выдает такой результат. gcc 3.3.3 работает, как ожидалось.
Of course, the code must be complete enough to compile and link.
Re: Ошибка в компиляторе VC7
От:
Аноним
Дата:
05.04.05 11:49
Оценка:
Ошибка, оказывается, не связана с шаблонами.
Например, такая программа
class Base;
void f(Base &b)
{
cout << "f: " << typeid(b).name() << endl;
}
class Base
{
public:
virtual void f() {}
};
class Derived : public Base
{
};
int _tmain(int argc, _TCHAR* argv[])
{
Derived d;
f(d);
return 0;
}
выводит
f: class Base
Т.е. компилятор не требует определения класса Base при вызове typeid с операндом типа ссылка на Base.
В стандарте (3.2.4) сказано, что класс T должен быть определен, если вызывается typeid с операндом типа T. Однако, в данном случае вызывается typeid с операндом типа ссылка на T. Дает ли это право компилятору не требовать определения класса T?
А>В стандарте (3.2.4) сказано, что класс T должен быть определен, если вызывается typeid с операндом типа T. Однако, в данном случае вызывается typeid с операндом типа ссылка на T. Дает ли это право компилятору не требовать определения класса T?
Нет, не дает. В 5.2.8 в нескольких пунктах повторяется: shall be completely-defined.
Of course, the code must be complete enough to compile and link.