Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 函数指针重载错误?_C++_Function Pointers_Pointer To Member - Fatal编程技术网

C++ 函数指针重载错误?

C++ 函数指针重载错误?,c++,function-pointers,pointer-to-member,C++,Function Pointers,Pointer To Member,我有以下定义和原型(它们是类的成员函数),我基本上尝试使用函数指针将不同类型的策略传递给divideQuery方法: typedef vector<ConstraintManager> (*strategyType1)(const Query&); typedef vector<ConstraintManager> (*strategyType2)(const Query&, int); vector<ConstraintManager> d

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

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)
DividingSolver.cpp:200:70:错误:调用'DividingSolver::divideQuery(,const klee::Query&')没有匹配的函数
DividingSolver.cpp:82:27:注:候选项为:std::vector DividingSolver::divideQuery(std::vector(*)(const klee::Query&),const klee::Query&)
DividingSolver.cpp:87:27:注:std::vector DividingSolver::divideQuery(std::vector(*)(常量klee::Query&,int),常量klee::Query&,int)
就我从网上读到的来看,这似乎是一个过载错误(或者其他什么),但无论如何,我不太确定到底是什么错了。如有任何提示/解释,不胜感激


Cheers

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

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


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

如果存在多个
divideRandom
函数(即,名称
divideRandom
重载),您将遇到的错误与此类似。您确定只有一个实现吗?我添加了
#include using std::vector;结构查询{}查询;结构约束管理器{}并为我编译。(gcc 4.7.?)类的
divideXXX
成员函数是否存在问题?这与未包含或未使用的内容无关?它表示“未解析的重载函数类型”,这意味着它不会将您的typedef识别为函数指针,或者更确切地说,它会识别,但不理解签名。@dribeas:根据错误消息,是的,它们是。@CharlesBailey:问题缺少一个要点,即这些都是成员函数。@CharlesBailey它是一个成员函数,因此问题被相应地编辑。谢谢。@CharlesBailey没问题,伙计。干杯;)
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)