2012-04-21 43 views
1
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; 
      } 
     } 
    } 
} 

它不工作,我有错误:排序与自己的模板阵列,C++比较功能

'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函数以使用模板?

+0

C++没有泛型,它有模板。这两者可能看起来一样,但他们的工作方式根本不同。 – Jasper 2012-04-21 14:36:55

+0

当我将'compare(T,T)'改为'compare(const T&,const T&)'并将'zamien'行注释掉时编译。至少当数字不同时,将'zamien'改为'std :: swap'会产生正确的结果。 – chris 2012-04-21 14:40:34

+0

@Jasper,但你使用模板来做泛型编程:-) – juanchopanza 2012-04-21 14:44:39

回答

2

的问题是,“比较”函数参数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&)){ 
    /* ... */ 
} 
+0

我仍然有这样的错误:'void bubble_sort(T [],int,bool (__cdecl *)(const T&,const T&))':当我想使用它时,无法从'int [10]'推导'T []'的模板参数:bubble_sort(tab,size,cmp) ,其中tab [] = {0,1,2,3,4,5,6,7,8,9}。 – 2012-04-21 15:18:37

+0

这为我编译︰http://ideone.com/6b13z – mfontanini 2012-04-21 15:20:10

+0

好吧,在ideone它的作品完美,但是当我尝试在MS Visual 2010中编译它时,我有错误。 – 2012-04-21 16:55:57

0

这就是我如何并与此问题:

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

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