Страница 1 из 1

VC++ compiler problem, bug (?) workaround needed.

Добавлено: Чт сен 18, 2003 4:08 am
Vovka
Компилятор не может переварить конструкцию, подобную такой:

Код: Выделить всё

template <class M>
struct MB
{
  void Print()
  {
    DoPrint();
  }

  virtual void DoPrint() = 0;
};

struct M : public MB<M>
{
  void DoPrint()
  {
    printf("Here we go...\n");
  }
};


Именно эта конструкция работает, но подобная - нет. Именно ту, на которой валится, приводить не хочу - там у MB ещё базы есть и параметры (ATLные). Если убрать вызов DoPrint, то всё нормально, а так выдаёт:

fatal error C1001: INTERNAL COMPILER ERROR
(compiler file 'msc1.cpp', line 1794)


Я обычно привык, что эта ошибка бывает, если какую-нить пургу напишешь, а тут проде вполне нормальная конструкция, и главное полезная - не знаю прока, как это обойти? Предложения?[/quote]

Добавлено: Чт сен 18, 2003 4:10 am
Vovka
Да, забыл добавить.
ATLный wizard добавляет ATL_NO_VTABLE, так я его убрал, от греха подальше.
VC++ 6

Добавлено: Чт сен 18, 2003 4:24 am
Vovka
О, забавно - если у этой виртуальной ф-ции присутствует параметр (указатель на COM-интерфейс), то валится, если нет - то всё нормально. :)

Добавлено: Чт сен 18, 2003 4:50 am
Vovka
Vovka писал(а):О, забавно - если у этой виртуальной ф-ции присутствует параметр (указатель на COM-интерфейс), то валится, если нет - то всё нормально. :)


Чем дальше, тем забавней.
COM Интерфейс объявлен в namespace, и если его про-typedef-нить в гобальный ns, то всё работает, т.е.:

Код: Выделить всё

virtual void DoSomething(ns::Iface * p)


падает, а

Код: Выделить всё

typedef ns::Iface Iface;
virtual void DoSomething(Iface * p)


работает.

Чистый баг, IMO.