我有以下定义和原型(它们是类的成员函数),我基本上尝试使用函数指针将不同类型的策略传递给divideQuery方法:
typedef vector<ConstraintManager> (*strategyType1)(const Query&);
typedef vector<ConstraintManager> (*strategyType2)(const Query&, int);
vector<ConstraintManager> divideQuery (strategyType1 s, const Query& query);
vector<ConstraintManager> divideQuery (strategyType2 s, const Query& query, int parts);
vector<ConstraintManager> divideByHalf(const Query& query);
vector<ConstraintManager> divideRandom(const Query& query);
vector<ConstraintManager> divideByN(const Query& query, int n);
然而,当我尝试调用(query
参数从包装函数传递时):
vector<ConstraintManager> result = divideQuery(divideRandom, query);
失败并显示错误消息:
DividingSolver.cpp:200:70: error: no matching function for call to ‘DividingSolver::divideQuery(<unresolved overloaded function type>, const klee::Query&)’
DividingSolver.cpp:82:27: note: candidates are: std::vector<klee::ConstraintManager> DividingSolver::divideQuery(std::vector<klee::ConstraintManager> (*)(const klee::Query&), const klee::Query&)
DividingSolver.cpp:87:27: note: std::vector<klee::ConstraintManager> DividingSolver::divideQuery(std::vector<klee::ConstraintManager> (*)(const klee::Query&, int), const klee::Query&, int)
据我从网上看,这似乎是一个重载错误(或者其他可能的东西),但无论如何我不太确定究竟是什么问题。任何提示/解释都表示赞赏。
干杯
答案 0 :(得分:5)
问题是非静态成员函数与自由函数没有相同的签名。特别是它有一个隐藏 this
指针。现在你所拥有的是对divideQuery
的调用,其中第一个参数是指向成员函数的指针,但是没有重载将指针指向成员函数,因此编译器会发出错误消息。
如果函数不使用类中的状态,则可以使它们static
,这将删除隐式this
,它应该可以工作。另一种选择实际上是在divideQuery
接口中使用指向成员的指针。第三个选项是使用更高级别的构造,如std::function<>
(或boost::function<>
)作为函数参数,然后使用std::bind
(boost::bind
)来绑定{{ 1}}论证。
答案 1 :(得分:4)
使divideRandom
为静态,然后它将与普通函数指针兼容。