虚基类构造器问题:无法实例化TemperatureSensor类
问题解决:无法实例化TemperatureSensor的构造函数问题
错误原因
你的基类Sensor<T>仅提供了带uint8_t address参数的构造函数,未定义默认构造函数。当派生类TemperatureSensor未显式声明构造函数时,编译器会尝试自动生成默认构造函数,但该生成过程需要调用基类的默认构造——而基类不存在默认构造,因此编译器会将派生类的默认构造标记为deleted,导致无参实例化TemperatureSensor sensor;报错。
解决方案
给TemperatureSensor显式定义带地址参数的构造函数,并在其中调用基类的带参构造函数传递地址:
修改后的代码
sensor.h
template<class T> class Sensor { public: uint8_t address; T data; virtual void collectData() = 0; Sensor(uint8_t address); }; class TemperatureSensor: public Sensor<float> { public: // 添加工有构造函数声明 TemperatureSensor(uint8_t address); void collectData(); };
sensor.cpp
template<typename T> Sensor<T>::Sensor(uint8_t address) { this->address = address; } // 实现TemperatureSensor的构造函数,调用基类构造传递地址 TemperatureSensor::TemperatureSensor(uint8_t address) : Sensor<float>(address) { // 可添加派生类专属初始化逻辑(如果需要) } void TemperatureSensor::collectData() { // some code for collecting data }
主函数调用
// 传入8位地址实例化(注意:0xbeef是16位值,若需要16位地址,需将Sensor类的address类型改为uint16_t) TemperatureSensor sensor(0xBE); Serial.printf("%d", sensor.address);
额外提示
如果你的传感器地址是16位(如你示例中的0xbeef),需要将基类Sensor<T>中的address成员类型从uint8_t改为uint16_t,同时对应修改构造函数参数类型,避免地址截断。
内容的提问来源于stack exchange,提问作者wojtess
相关产品推荐
相关产品推荐

