在为 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/