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

Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

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

Post by Vovka »

Компилятор не может переварить конструкцию, подобную такой:

Code: Select all

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]
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

Да, забыл добавить.
ATLный wizard добавляет ATL_NO_VTABLE, так я его убрал, от греха подальше.
VC++ 6
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

О, забавно - если у этой виртуальной ф-ции присутствует параметр (указатель на COM-интерфейс), то валится, если нет - то всё нормально. :)
Vovka
Уже с Приветом
Posts: 1906
Joined: 14 Mar 2001 10:01

Post by Vovka »

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


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

Code: Select all

virtual void DoSomething(ns::Iface * p)


падает, а

Code: Select all

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


работает.

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

Return to “Вопросы и новости IT”