【发布时间】:2019-04-18 02:05:24
【问题描述】:
在下面的代码中,我希望用户能够创建具有特定类型的消费者类,例如Consumer<StateA>,以便他们的回调函数可以正确处理他们提供的类型。但是在下面的代码中,编译器会抱怨,因为在编译时,没有生成对 StateB 消费方法中的函数的调用。消费方法来自基类,它们必须被覆盖。
template <class T>
class Consumer : ConsumerBase
{
public:
Consumer(std::function<void(T&)> _callback){
callback = _callback;
}
virtual void consume(StateA& state) {
callback(state);
}
virtual void consume(StateB& state) {
callback(state);
}
private:
std::function<void(T&)> callback;
};
基类:
class ConsumerBase
{
public:
virtual void consume(StateA& state) = 0;
virtual void consume(StateB& state) = 0;
};
我怎样才能做到这一点?
【问题讨论】:
-
尽我所能理解这个问题,子类只需要声明一个
consume()方法,带有T &参数,这样它就可以覆盖超类中的等效方法(以及声明应该使用override关键字而不是virtual,以帮助您的编译器捕获代码中的错误)。如果超类仅定义抽象方法,则需要使用不同的方法,但是由于您的问题缺少 minimal reproducible example,如 stackoverflow.com 的 help center 中所述,无法提供进一步的建议。 -
@SamVarshavchik 谢谢,我已经添加了基类,它具有必须覆盖的纯虚函数。
-
我怀疑不是
consume(StateB&)没有生成,而是无法编译。在Consumer<StateA>中没有callback(StateB&),唯一可见的callback采用StateA&,因此您无法编译定义。 -
@jthill 是的,你是对的。我的意思是说(由编译器)找不到对(回调)函数的调用,因为没有使用 StateB 生成的回调函数。
标签: c++ c++11 templates callback pure-virtual