c++ - 函数模板调用中的<未解析的重载函数类型>

标签 c++ c++11 templates c++14 function-pointers

我有一个 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),但是 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)){
    ...
}

或者,完全放弃函数指针并使用模板以允许使用任何可调用对象(例如 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/

相关文章:

c++ - 为什么 SFINAE 在它应该工作的地方导致编译器错误?

c++ - 应用一组 N 个函数中的第一个有效函数

c++ - 故障位是否会影响 cin 上的调用忽略?

c++ - 杀死等待条件变量的 pthread

c++ - 如何在 GLUT 上加载 bmp 以将其用作纹理?

c++ - 这对会被感动吗?

C++ class property setter getter Macro vs 模板

c++ - decltype、result_of 还是 typeof?

c++ - 通过外部信号停止 std::thread 的有效方法是什么?

c++ - 根据条件从函数模板返回不同的类型