【发布时间】:2019-12-09 14:39:08
【问题描述】:
这是位于接口中的虚拟排序函数的声明,使用 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 的子级。
在实例化包含上述运算符的类时使用 std::function:
Sort(Tools::OrderComparer(grid, false));
->OrderComparer 包含上面显示的运算符
-> 顶部也提到了排序。
如果有任何问题或不清楚的地方,请随时提出!
简化的错误信息:
没有合适的用户定义的从(包含运算符的类)到(std::function 寻址运算符)的转换
【问题讨论】:
-
这是给你的minimal reproducible example(通常你应该自己创建):godbolt.org/z/PcA5zJ
-
因此,如果编译器允许您尝试执行的操作,那么如果代码的其他部分调用您的
Comparefunction并带有GridDataStruct的子代 not,您会期望发生什么Types::Order类型的?简单来说,你的代码说Sort想要一个CarComparer,但你只给它一个PorscheComparer。编译器对此不满意是完全正确的——如果有人使用CarComparer比较两个Mercedes实例怎么办? -
你说得有道理。我还真没想到。
-
我不知道您的方法是否错误,问题包含的信息太少,无法判断(这很好,原始问题不那么广泛)。但是进一步考虑这一点应该会导致您的设计中出现某种不合逻辑的接缝或边缘情况。也许您可以将
Sort(或整个界面)作为模板而不是运行时多态性? -
已经是模板了,但是Type用于其他抽象函数的声明。所以我不得不转而采用不同的方法。无论如何非常感谢你,我感谢你的帮助!
标签: c++ inheritance polymorphism std-function