【问题标题】:Sorting an array with own template compare function in C++在 C++ 中使用自己的模板比较函数对数组进行排序
【发布时间】:2012-04-21 14:35:31
【问题描述】:
template <class T>
bool cmp(const T &a, const T &b){
    return a <= b;
}

template <class T>
void bubble_sort(T tablica[], int size, bool compare(T,T)){
    bool change = true;

    while(change){
        change = false;
        for(int i=0; i < size-1; ++i){
            if(compare(tablica[i+1], tablica[i])){
                zamien(tablica[i+1], tablica[i]);
                change = true;
            }
        }
    }
}

它不起作用,我有错误:

'void bubble_sort(T [],int,bool (__cdecl *)(T,T))' : 
 could not deduce template argument for 'T []' from 'int [10]'  
'void bubble_sort(T [],int,bool (__cdecl *)(T,T))' :
 cannot use function template 'bool cmp(const T,const T)' as a function argument'

但是当我用那个替换 cmp 函数时:

bool cmp(const int a, const int b){
    return a <= b;
}

一切正常。 如何更改我的 cmp 函数以使用模板?

【问题讨论】:

  • C++ 没有泛型,它有模板。两者可能看起来相同,但它们的工作方式根本不同。
  • 当我将compare(T,T) 更改为compare (const T &amp;, const T &amp;) 并注释掉zamien 行时编译了我的。至少当数字不同时,将 zamien 更改为 std::swap 会产生正确的结果。
  • @Jasper 但您使用模板进行通用编程:-)
  • 我想。但是 C++ Templates 是一个可以举起汽车的丑陋的健美运动员,而泛型只是一个普通的乔,恰好擅长打扮......

标签: c++ sorting compare


【解决方案1】:

问题在于bubble_sort 期望的“比较”函数参数的类型为:

bool compare(T,T)

虽然“cmp”函数属于:

bool compare(const T&,const T&)

为了修复它,修改“比较”参数的类型:

template <class T>
void bubble_sort(T tablica[], int size, bool compare(const T&,const T&)){
    /* ... */
}

【讨论】:

  • 我仍然有那个错误:'void bubble_sort(T [],int,bool (__cdecl *)(const T &,const T &))':无法推断出'T [ ]' from 'int [10]' 当我想像这样使用它时:bubble_sort(tab, size, cmp), 其中 tab[] = {0,1,2,3,4,5,6,7,8, 9}.
  • 好的,在 ideone 上它运行良好,但是当我尝试在 MS Visual 2010 中编译它时出现错误。
【解决方案2】:

我是这样处理这个问题的:

int (*cmp_int)(int,int) = compare<int>;
bubble_sort(in, 5, cmp_int);

现在它在 MS Visual 中应该可以正常工作了。

【讨论】:

    猜你喜欢
    • 2020-05-28
    • 1970-01-01
    • 2019-07-23
    • 2012-09-26
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多