【问题标题】:c++ - <unresolved overloaded function type> in function template callingc++ - 函数模板调用中的<未解析的重载函数类型>
【发布时间】:2016-11-20 12:32:03
【问题描述】:

我有一个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问题,但仍然没有。如何使这个程序运行?

【问题讨论】:

  • OT 但是...我想getI() 应该返回int,而不是float

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


【解决方案1】:

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 {
    ...
}

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多