C++の関数ポインタについて
例えば汎用的に整列操作を行えるクラスを作ろうと考えます。
で、以下のようなクラスをでっちあげました。
#include <stdlib.h>
#include <stdio.h>
#include <vector>
using namespace std;
template< class T >class Sort{
private:
inline void swap( vector< T > data , int i , int j ){
T t = data[ i ]; data[ i ] = data[ j ]; data[ j ] = t;
}
public:
vector< T > Data;
Sort( vector< T > data ){
Data = data;
}
void selection( vector< T > data , int ( *func )( vector< T > data , int i , int j ) ) {
int min , N = data.size();
{for( int i = 1; i < N; i++ ){
min = i;
for( int j = i + 1; j <= N; j++ ){
if( func( data , min , j ) ){ min = j; }
}
swap( data , min , i );
}}
}
static int comp( vector< T > data , int i , int j ){
return data[ i ] >= data[ j ];
}
};
void main( void ){
Sort< int > *d;
vector< int > data( 20 );
d = new Sort< int >( data );
d->selection( data , d->comp );
return;
}
中身は整列ソートだけでとても寂しいですが、教科書的に比較部分を汎用的に関数をユーザーが選んで指定できるようになっています。今回はmainからSortクラスでstaticで宣言したcompを指定していますが、staticにしたくないです。でもなっちゃっているのはstaticを外すとコンパイルエラーになるからです。
staticを外したメンバ関数を指定すると例えばこんなエラーがでます。
エラー E2034 template.cpp 43: 'int (* (_closure )(vector<int,allocator<int> >,int,int))(vector<int,allocator<int> >,int,int)' 型は 'int (*)(vector<int,allocator<int> >,int,int)' 型に変換できない(関数 main() )
エラー E2342 template.cpp 43: パラメータ 'func' は int (*)(vector<int,allocator<int> >,int,int) 型として定義されているので void は渡せない(関数 main() )
なんでこのようなエラーになるのか分かりません。メンバ関数を指定したいのですが、指定の仕方が分かりません。どなたか教えてください。本当に困ってしまっています。
お礼
ありがとうございます。 引数の型指定も省けるとは知りませんでした。 私の探し方が悪いのか、 WEBではなかなか解説が見つからず困っておりました。 ありがとうございました。 (しかし、returnさがしてvoid|intに振り分けるの大変だなぁ・・・)