我有一个 class A
,它有两个属性 val(float) 和 i(int)。我创建了实现快速排序的 sort()
函数,它接受两个函数指针——第一个接受两个 A 类类型对象,它允许我选择要排序的属性,第二个是一个模板函数,它允许我选择是按升序还是降序排序。实现如下:
#include <iostream>
#include <vector>
class A{
float val;
int i;
public:
A(float v, int j): val(v), i(j){} //constructor
float getVal(){ return val;}
float getI(){ return i;}
};
template <typename T>
bool compareVal(A _One, A _Two, bool (*comparator)(T,T)){
return comparator(_One.getVal(),_Two.getVal());}
template <typename T>
bool compareI(A _One, A _Two, bool (*comparator)(T,T)){
return comparator(_One.getI(),_Two.getI());}
template <typename T>
bool less(T a, T b){
return a<b;
}
template <typename T>
bool greater(T a, T b){
return a>b;
}
//a quicksort program
template <typename T>
void sort(std::vector<A>& _as, int left, int right, bool (*compare)(A, A),
bool (*comparator)(T,T)){
int i = left, j = right;
int middle = (left + right)/2;;
if (right - left < 1) return;
while (i <= j) {
while (compare(_as[i],_as[middle], comparator)) i++; //compare called
while (compare(_as[middle],_as[j], comparator)) j--; //compare called
if (i <= j) { std::swap(_as[i], _as[j]); i++; j--; }
}
if (left < j) sort(_as, left, j, compare, comparator);
if (i < right) sort(_as, i, right, compare, comparator);
}
int main(){
std::vector<A> v;
//some inserts
sort(v, 0, v.size()-1, compareVal, less<float>); // first call
sort<float>(v, 0, v.size()-1, compareVal, less); // second call
sort<float>(v, 0, v.size()-1, compareVal, less<float>); //third call
return 0;
}
但是,当从 main()
调用 sort()
函数时,它会在所有三个实例中给出编译器错误:
error: no matching function for call to ‘sort(std::vector<A>&, int, std::vector<A>::size_type,
<unresolved overloaded function type>, <unresolved overloaded function type>)’
我无法理解错误。查看了与此相关的一些先前的 stackoverflow 问题,但仍然没有。如何使这个程序工作?
最佳答案
compare
被声明为 bool(*)(A, A)
,但是 compareVal
和 compareI
两者的类型都是 bool(*)(A, A, bool(*)(T, T))
。相应地更改 sort
的签名:
template <typename T>
void sort(std::vector<A>& _as, int left, int right,
bool (*compare)(A, A, bool(*)(T, T)),
bool (*comparator)(T, T)){
...
}
或者,完全放弃函数指针并使用模板以允许使用任何可调用对象(例如 lambda):
template <typename T, typename CompareT, typename ComparatorT>
void sort(std::vector<A>& _as, int left, int right,
CompareT compare, ComparatorT comparator {
...
}
关于c++ - 函数模板调用中的<未解析的重载函数类型>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40704040/