こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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() )

なんでこのようなエラーになるのか分かりません。メンバ関数を指定したいのですが、指定の仕方が分かりません。どなたか教えてください。本当に困ってしまっています。

投稿日時 - 2008-08-25 22:26:27

QNo.4278514

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

その比較関数は, どのように呼び出すつもりですか?
しかし, なんというかどのくらい「汎用性」を考えてつくったコードなんだろう, これ....
直交性を考えるなら比較関数はクラス Sort のメンバーとしないのが普通だし....

投稿日時 - 2008-08-26 03:02:40

ANo.1

 こんばんは。

>>void selection( vector< T > data , int ( *func )( vector< T > data , int i , int j ) )
 これだと、静的な関数ポインタしか受け付けません。

void selection( vector< T > data , int ( Sort<T>::*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((this->*func)( data , min , j ) )
{
min = j;
}
}
swap( data , min , i );
}
}
}
 ではないでしょうか?

投稿日時 - 2008-08-25 23:09:12

あなたにオススメの質問