2

我有以下定义和原型(它们是类的成员函数),我基本上尝试使用函数指针将不同类型的策略传递给 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)

就我从网上阅读的内容而言,这似乎是一个重载错误(或者可能是其他错误),但无论如何我不太确定到底出了什么问题。任何提示/解释表示赞赏。

干杯

4

2 回答 2

5

问题是非静态成员函数与自由函数没有相同的签名。特别是它有一个隐藏 this的指针。现在您所拥有的是divideQuery对第一个参数是指向成员函数的指针的调用,但是没有重载需要指向成员函数的指针,因此编译器会以错误消息退出。

如果函数不使用类中的状态,您可以制作它们static,这将删除隐式this并且它应该可以工作。divideQuery另一种选择实际上是在接口中使用指向成员的指针。第三个选项是使用更高级别的构造,例如std::function<>(或boost::function<>)作为函数参数,然后使用std::bindboost::bind)绑定this参数。

于 2012-07-09T21:57:07.323 回答
4

设为divideRandom静态,则它将与普通函数指针兼容。

于 2012-07-09T21:53:34.230 回答