c++在派生中定义模板化基类在IAR ARM编译器中不起作用

标签 c++ templates arm abstract iar

在为 ARM 设备构建时,此场景适用于 Visual Studio 但不适用于 IAR,我遇到了一个严重错误。这是场景

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

}

我在派生类中定义抽象基类模板。每个派生类将以不同方式定义枚举常量,我理解这会在 IAR 编译器如何实现动态多态性方面产生问题。
我注意到 vtable 无法在 ARM 设备中创建,因为 vptr 指向一个不可访问的位置。但是对于 win32,vtable 的构建对于这两种情况都很好。

问题是,为什么这会导致构建到 ARM 设备时出现问题,但在 win32 中运行良好。

最佳答案

您的代码有未定义的行为。 B 的基类类型是A<int, BlaEnum::Bla2>但你声明 Base作为A<int>*扩展为 A<int, BlaEnum::Bla1>* .强制使用 A<int, BlaEnum::Bla2>* 是一种严格的别名违规行为到 A<int, BlaEnum::Bla1>*并通过它访问。

关于c++在派生中定义模板化基类在IAR ARM编译器中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53561356/

相关文章:

c - 多核:LPC43xx 系列:Cortex M0 时钟

集会? LD & 移动

c++ - 使用C++和Visual Studio调试是否有办法在超出数组或内存分配的界限时始终抛出异常?

c++ - Boost PTree 仅用于读取文件还是用于存储值?

c++ - 如何编写返回引用或值的函数模​​板?

c++ - Clang 和 GCC 误推模板参数

c++ - 任意数量控制点的 B 样条曲线

c++ - 传递\in C++ 的命令行参数

templates - (Dynamic Jasper Reports) 从自定义 .jrxml 文件导入参数

c - 如何在 CANbus RX/TX FIFO 起始地址寄存器 (ATSAME51) 的特定地址处初始化数组?