为什么使用 parent 声明的 std::function 在与 child 一起使用时显示错误?

Why does using a std::function declared with the parent show me an error when used with a child?

这是位于接口中的虚拟 Sort-function 的声明,使用 std::function。

using Comparefunction = std::function<bool(const DataHandling::GridDataStruct &d1, const 
DataHandling::GridDataStruct  &d2)>;

virtual bool Sort(const Comparefunction& fct);

这是std::function:

所指的函数
bool operator() (const Types::Order &d1, const Types::Order &d2)const;

其中 Types::Order 是 GridDataStruct 的 child。

std::function 被使用,而包含上述运算符的 class 被实例化:

 Sort(Tools::OrderComparer(grid, false));

->OrderComparer 包含上面显示的运算符

-> 上面也提到了排序

如果有任何问题分别不清楚,请随时提出!

简化的错误消息:

没有合适的 user-defined 从(Class 包含运算符)到(std::function 寻址运算符)

的转换

这归结为

struct Base { virtual ~Base(); };

struct Derived : Base {};

struct Comparer
{
    bool operator()(const Derived&, const Derived&)
    {
        return true;
    }
};

std::function<bool(const Base&, const Base&)> comp(Comparer{});

https://godbolt.org/z/_7Xtfn

comp 应该能够比较两个 Base 实例。但是Comparer只能比较Derived个实例,所以不能用来初始化comp.

或者,重复上面的注释:代码说“Sort 想要一个 CarComparer”,但你只给了它一个 PorscheComparer。编译器对此不满意是完全正确的——如果有人使用 CarComparer 来比较两个 Mercedes 实例怎么办?

也许 PorscheComparer 只会用于比较 Porsche 个实例。表达这一点的简洁方法是在具体汽车类型上使用模板 Sort(或整个接口)——可能完全消除继承层次结构(用编译时多态性代替它)。

您正在呈现一个接口,该接口可以接受从 DataHandling::GridDataStruct.

派生的任何内容中的两个

但是实际实现只能取两个Types::Order,一个更具体,更派生的class。

我认为你的期望在这里倒退了。