c ++ определение шаблонного базового класса в производном не работает в компиляторе IAR ARM - PullRequest
0 голосов
/ 30 ноября 2018

Этот сценарий работает в Visual studio, но не для IAR, при сборке для устройства ARM, я получаю серьезную ошибку.Вот сценарий

enum  BlaEnum
{
  Bla1,
  Bla2
};

template <class T, BlaEnum bla = Bla1>
class A
{
public:
   virtual void Foo() = 0;
   T att;
   BlaEnum bll;
};

class B : public A<int, BlaEnum::Bla2>
{
public:
   void Foo() override;
};

int youu = 9;
void B::Foo() {
++youu;
}

int main(void)
{

 B b;
 A<int>* Base = (A<int>*) &b;  
 Base1->Foo(); //works for win32 but hard faults when it runs in ARM device

 B b2;
 A<int,BlaEnum::Bla2>* Base2 =  &b2;  
 Base2->Foo(); //works for both ARM and win32

}

Я определяю шаблоны базового класса Abstract в производном классе.каждый производный класс будет определять константу enum по-своему, и я понимаю, что это создает проблему в том, как реализован динамический полиморфизм для компилятора IAR.
Я заметил, что vtable не может быть создан в устройстве ARM, поскольку vptr указывает на недоступныйместо нахождения.но для win32 vtable встроен просто отлично для обоих случаев.

Вопрос в том, почему именно это вызывает проблемы при сборке на устройстве ARM, но прекрасно работает в win32.

1 Ответ

0 голосов
/ 30 ноября 2018

Ваш код имеет неопределенное поведение.Тип базового класса B равен A<int, BlaEnum::Bla2>, но вы объявляете Base как A<int>*, который расширяется до A<int, BlaEnum::Bla1>*.Строгое нарушение псевдонимов - разыграть A<int, BlaEnum::Bla2>* на A<int, BlaEnum::Bla1>* и получить доступ через него.

...