2010-12-30 7 views
1

パラメータとして別のものへの一般的な関数を渡すことはできませんが、私は休閑エラーを取得:C++は:私は以下に示すように、複数の選択ソート機能に機能を比較渡したい

Error 1 error C2664: 'sort' : cannot convert parameter 3 from 'bool (__cdecl *)(int,int)' to 'bool *(__cdecl *)(T,T)' c:\users\milad\documents\visual studio 2008\projects\functionpass\functionpass\passcompare.cpp 49 FunctionPass 

コード:

bool integerCompare (int a , int b) 
{ 
    return(a<b); 
} 
bool charCompare (char a , char b) 
{ 
    return(a<b); 
} 
bool stringCompare (string a , string b) 
{ 
    if(a.compare(b)<0) return true; 
    else return false; 
} 
template <class T> 
void sort(T x[], int n , bool(*whichCompare(T,T))) // n=size of the array 
{ 
    for (int pass=0; pass<n-1; pass++) { 
     int potentialSmallest = pass; 
     for (int i=pass+1; i<n; i++) { 
      if ((*whichCompare)(x[i],x[potentialSmallest])) { 
       potentialSmallest = i; 
      } 
     } 

     int temp = x[pass]; 
     x[pass] = x[potentialSmallest]; 
     x[potentialSmallest] = temp; 
    } 
} 
template <typename T> 
void printArray(T a[], int size) 
{ 
    for(int i=0;i<size;i++) 
     cout<<" "<<a[i]; 
} 
int main() 
{ 
    int intArray[] = {1,7,-8,-14,46,33,4}; 
    sort <int>(intArray , 7 , integerCompare); 
    printArray<int>(intArray,7); 
} 
+3

使用 'BOOL(* whichCompare)の代わりに' BOOL(* whichCompare(T、T))の(T、T)は、 ''。 – lijie

答えて

7

あなたはこれを持っている:

template <class T> void sort(T x[], int n , bool(*whichCompare(T,T))) 
{ /*...*/ } 

を返す関数へのポインタのためのパラメータ宣言とタイプTの2つの引数が間違っています。おそらく、本当に欲しかっ:

template <class T> void sort(T x[], int n , bool (*whichCompare)(T,T)) 
{ /*...*/ } 

通常、このような機能は次のように書かれていますが:operator()()を提供オブジェクト

template <class T, typename Functor> 
void sort(T x[], int n , Functor whichCompare) 
{ 
    // ... 
    bool result = whichCompare(x[i], x[potentialSmallest]); 
    // ... 
} 

この方法では、ユーザーが唯一の関数ポインタを渡すことはできませんが、機能します:

struct MyIntegerCompareFunctor 
{ 
    bool operator()(int a, int b) { return a < b; } 
}; 

sort(intArray, 7, MyIntegerCompareFunctor()); 
sort(intArray, 7, &integerCompare); // Works too 

C++標準ライブラリによって提供されるアルゴリズムの中には、liこれ

+1

+1。なぜ、*なぜ*関数オブジェクトを許可するのが望ましいのかを指摘するために、状態を保持し、より柔軟で強力なものにすることができ、コンパイラがインライン化しやすくなるので、しばしばより高速になります。 – jalf

+0

+1コードを書くもっと一般的な方法は、Functorが別のテンプレートパラメータであることです。 – SCFrench

2

コンパイル済みの行の修正を参照してください。また、このように関数自体をtemplatiseでき

template <class T> 
void sort(T x[], int n , bool(*whichCompare)(T,T)) // n=size of the array 
{ 
    for (int pass=0; pass<n-1; pass++) { 
     int potentialSmallest = pass; 
     for (int i=pass+1; i<n; i++) { 
      if (whichCompare(x[i],x[potentialSmallest])) { 
       potentialSmallest = i; 
      } 
     } 

     int temp = x[pass]; 
     x[pass] = x[potentialSmallest]; 
     x[potentialSmallest] = temp; 
    } 
} 

:それは簡単だったが、またするなどファンクタ/ブースト機能/ブーストバインドすることができますという理由だけで

template< typename T, typename Pred > 
void sort(T x[], int n, Pred whichCompare) 
{ // etc. 
} 

は、私が最初にこれを行うために使用されますあなたのアルゴリズムで使用されます。

0

はるかセクシー溶液がある。

bool integerCompare (int a , int b) 
{ 
    return(a<b); 
} 
bool charCompare (char a , char b) 
{ 
    return(a<b); 
} 

bool stringCompare (string a , string b) 
{ 
    return (a.compare(b)<0); 
} 

template <typename T, size_t n > 
void sort(T (&x)[n], bool whichCompare (T,T)) // n=size of the array 
{ 
    for (int pass=0; pass<n-1; pass++) { 
     int potentialSmallest = pass; 
     for (int i=pass+1; i<n; i++) { 
      if (whichCompare(x[i],x[potentialSmallest])) { 
       potentialSmallest = i; 
      } 
     } 

     std::swap(x[pass], x[potentialSmallest]); 
    } 
} 


template <typename T, size_t n> 
void printArray(T (&a)[n]) 
{ 
    for(int i=0;i<n;i++) 
     cout<<" "<<a[i]; 
} 
int main() 
{ 
    int intArray[] = {1,7,-8,-14,46,33,4}; 
    sort (intArray, integerCompare); 
    printArray(intArray); 
} 
関連する問題