c++ - C ++静态继承中的取消引用指针问题?
问题描述
我正在尝试使用静态多态性,但我收到编译时警告和分段错误错误。出了什么问题?
编译器:arm-linux-g++ (GCC) 4.4.2
警告:取消引用指针“this.123”确实违反了严格别名规则,警告:取消引用指针“this.124”确实违反了严格别名规则
#include <unistd.h>
#include "extlib.h" ///void ledFunc(uint32_t state);
template<typename T>
class BaseLed {
public:
explicit BaseLed(){}
virtual ~BaseLed() {}
void turnOn(){static_cast<T*>(this)->trunOn();}
void turnOff(){static_cast<T*>(this)->trunOff();}
};
class Led: public BaseLed<Led>{
public:
typedef void (*LedFuncPtr)(uint32_t);
Led():
BaseLed<Led>(), mLedSetPtr{ledFunc}
{}
virtual ~Led(){}
void trunOn(){ mLedFuncPtr(1); }
void trunOff(){ mLedFuncPtr(0); }
private:
LedFuncPtr mLedFuncPtr;
};
int main() {
BaseLed<Led> led;
led.turnOn();
sleep(2);
led.turnOn();
return 0;
}
解决方案
led
不是a Led
,是a BaseLed<Led>
。
在turnOn
and中,如果确实是 type 的对象,turnOff
则只能取消引用强制转换的指针,而事实并非如此。
因为它不是,所以行为是未定义的。*this
T
这是相同的情况,但没有模板:
struct A
{
void foo();
};
struct B: A
{
void bar() {}
};
void A::foo()
{
static_cast<B*>(this)->bar();
}
int main()
{
A a;
a.foo();
}
您需要一个正确类型的对象:
int main() {
Led led;
led.turnOn();
sleep(2);
led.turnOn();
return 0;
}
推荐阅读
- firefox - Gridalicious 库未在 Firefox 中以全屏宽度加载网格
- batch-file - Delete files based on partial names in a text file
- python - altair 分组条形图格式轴和填充
- c++ - 如何将cpp文件中的静态函数暴露给其他文件
- php - PHP Laravel 单元测试,自定义断言失败消息
- javascript - 未捕获的类型错误:无法设置属性
- floating-point - 小数到字符串 - FloatToStrF 返回不精确的结果 - 替代解决方案?
- javascript - 特快专递制作provisionnel标头
- wxpython - wxpython中添加滚动条,但是没有出现
- xml - xslt - 删除具有特定 text() 的 foreach 语句中的数据