C++模板继承场景下operator()虚函数未定义引用编译错误求助
问题根源及修复方案
错误1:基类虚函数未提供实现也未声明为纯虚
你在基类Trigger<T>中声明的operator()是普通虚函数,没有追加= 0声明为纯虚函数,C++要求所有非纯虚的虚函数必须提供实现,即使派生类已经重写了该函数。链接阶段生成基类虚函数表时会查找基类operator()的定义,找不到就会抛出你遇到的未定义引用错误。
错误2:主函数中类名引用错误
ZeroCrossingRisingTrigger是独立的模板类,不是Trigger类的内部嵌套类,你调用时加的Trigger::前缀是错误的,会导致编译器找不到类定义。
修复步骤
- 优先将基类的
operator()改为纯虚函数,你的Trigger本身就是抽象基类,不需要实例化,纯虚函数不需要提供实现,刚好符合设计需求:
// 基类中修改operator()声明,追加=0 virtual bool operator()(const T &first, const T &second) const = 0;
如果不想用纯虚函数,也可以给基类operator()补充默认实现:
template <typename T> bool Trigger<T>::operator()(const T &first, const T &second) const { // 自定义默认逻辑,示例返回false return false; }
- 修改主函数中的实例化代码,去掉错误的
Trigger::前缀:
int main([[maybe_unused]] int argc, [[maybe_unused]] char const *argv[]) { ZeroCrossingRisingTrigger<double> trig; return 0; }
可选优化
派生类operator()中的按位与&建议替换为逻辑与&&,符合条件判断的编码习惯,避免后续其他场景下出现非预期的按位运算逻辑。
内容的提问来源于stack exchange,提问作者SpiRelli
相关产品推荐
相关产品推荐

