使用基类引用作为谓词时编译失败

Seç*_*şçı 3 c++11

class baseFunctor{
  virtual ~baseFunctor() {}
  virtual bool operator()(const A& lhs, const A& rhs) = 0;
};
class derivedFunctor : public baseFunctor{
  bool operator()(const A& lhs, const A& rhs) override { /*implementation*/ }
};
Run Code Online (Sandbox Code Playgroud)

在另一个不相关的方法中,我有:

baseFunctor* functor = new derivedFunctor();
std::vector<A> vectorA;
Run Code Online (Sandbox Code Playgroud)

我的目的是使用这个仿函数作为比较函数,如下所示:

std::make_heap(vectorA.begin(),vectorA.end(),*functor);
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

C2893无法专门化函数模板'void std :: make_heap(_RanIt,_RanIt,_Pr)'

在那种情况下使用指针到functor的正确方法是什么?

R. *_*des 7

函数对象在标准算法中按值传递.这意味着该derivedFunctor对象将通过值传递为baseFunctor.因为baseFunctor是一个代码无法编译的抽象类.(如果它不是一个抽象类,代码会编译,但可能由于对象切片问题而行为不端.)

为了使这项工作,你可以使用类似的东西std::reference_wrapper:

std::make_heap(vectorA.begin(),vectorA.end(),std::ref(*functor));
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为引用包装器对象避免复制仿函数并保留引用; 因为它可以直接调用,只是简单地将参数转发给对象引用.