2016-11-20 3 views
0

У меня есть class A с двумя атрибутами val (float) и i (int). Я создал функцию sort(), реализующую quicksort, которая принимает два указателя на функции - во-первых, которые принимают два объекта класса A, которые позволяют мне выбирать, какой атрибут нужно сортировать, а второй - функцию шаблона, которая позволяет мне выбирать, сортировать ли в порядке возрастания или убывания , Реализация выглядит следующим образом:C++ - <неразрешенный перегруженный тип функции> в вызове шаблона функции

#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; 
} 

Но, когда sort() функция вызывается из main() дает ошибку компилятора во всех трех случаях, как:

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, связанные с этим, но все равно ничего. Как заставить эту программу работать?

+1

OT, но ... Я полагаю, что 'getI()' должен возвращать 'int', а не' float' – max66

ответ

2

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

В качестве альтернативы, канавы указателей на функцию в целом и использовать шаблоны, чтобы позволить любому вызываемому быть использован (например, лямбда):

template <typename T, typename CompareT, typename ComparatorT> 
void sort(std::vector<A>& _as, int left, int right, 
       CompareT compare, ComparatorT comparator { 
    ... 
} 
Смежные вопросы