c++ - <unresolved overloaded function type> 在函数模板调用中

c++ - <unresolved overloaded function type> in function template calling

我有一个 class A 有两个属性 val(float) 和 i(int)。我创建了 sort() 实现快速排序的函数,它接受两个函数指针——第一个接受两个 class 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>)’

我无法理解这个错误。查看了与此相关的一些先前的 Whosebug 问题,但仍然没有。如何使这个程序运行?

compare 被声明为 bool(*)(A, A),但是 compareValcompareI 都具有类型 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)){
    ...
}

或者,完全放弃函数指针并使用模板以允许使用任何可调用对象(例如 lambdas):

template <typename T, typename CompareT, typename ComparatorT>
void sort(std::vector<A>& _as, int left, int right,
              CompareT compare, ComparatorT comparator {
    ...
}