为什么使用 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{});
comp
应该能够比较两个 Base
实例。但是Comparer
只能比较Derived
个实例,所以不能用来初始化comp
.
或者,重复上面的注释:代码说“Sort
想要一个 CarComparer
”,但你只给了它一个 PorscheComparer
。编译器对此不满意是完全正确的——如果有人使用 CarComparer
来比较两个 Mercedes 实例怎么办?
也许 PorscheComparer
只会用于比较 Porsche
个实例。表达这一点的简洁方法是在具体汽车类型上使用模板 Sort
(或整个接口)——可能完全消除继承层次结构(用编译时多态性代替它)。
您正在呈现一个接口,该接口可以接受从 DataHandling::GridDataStruct
.
派生的任何内容中的两个
但是实际实现只能取两个Types::Order
,一个更具体,更派生的class。
我认为你的期望在这里倒退了。
这是位于接口中的虚拟 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{});
comp
应该能够比较两个 Base
实例。但是Comparer
只能比较Derived
个实例,所以不能用来初始化comp
.
或者,重复上面的注释:代码说“Sort
想要一个 CarComparer
”,但你只给了它一个 PorscheComparer
。编译器对此不满意是完全正确的——如果有人使用 CarComparer
来比较两个 Mercedes 实例怎么办?
也许 PorscheComparer
只会用于比较 Porsche
个实例。表达这一点的简洁方法是在具体汽车类型上使用模板 Sort
(或整个接口)——可能完全消除继承层次结构(用编译时多态性代替它)。
您正在呈现一个接口,该接口可以接受从 DataHandling::GridDataStruct
.
但是实际实现只能取两个Types::Order
,一个更具体,更派生的class。
我认为你的期望在这里倒退了。