2

関数ポインタを別の関数に渡しており、デフォルトで初期化したいのですが、これが私が試していることですが、これにより構文エラーが発生します

void bar(int i) {}
void foo(void (*default_bar=bar)(int)) {
//
}

エラー :

Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/f_13.d" -MT"src/BinarySearchTree_13.d" -o "src/BinarySearchTree_13.o" "../src/f_13.cpp"
In file included from ../src/f_13.cpp:10:
../src/tree.h:51: error: expected `)' before '=' token
../src/tree.h:51: error: 'foo' declared as function returning a function
../src/tree.h:51: error: expected ';' before ')' token
../src/tree.h:60: error: expected `;' before 'void'
make: *** [src/f_13.o] Error 1

これがうまく機能するという点だけです:

void foo(void (*default_bar)(int)) {
4

2 に答える 2

8

こちらです:

void foo(void (*default_bar)(int) = bar)
于 2013-02-16T19:10:23.217 に答える
6

typedef問題を単純化するために使用する場合:

typedef void (*fun_type)(int);

その後、あなたは自分自身を理解することができます:

void foo(fun_type default_bar = bar) 
{
}

簡単ですね。

複雑な宣言を簡単にするために、次のようidentityに定義されているものを使用します。

template<typename T> using identity = T;

これを使用して、関数を次のように記述できます。

void foo(identity<void(int)> default_bar = bar) 
{
}

identity宣言を簡略化するその他の例:

identity<int[100][200]> * v;

これは次と同じです:

int (*v)[100][200];

別:

identity<int(int,int)> *function(identity<int(int,char*)> param);

これは次と同じです:

int (*function(int (*param)(int,char*)))(int,int);

を使用identityすると、宣言は確実に少し長くなりますが、トークンを解析して1つずつ理解することも簡単になります。そうすれば、宣言全体が簡単になります!

お役に立てば幸いです。

于 2013-02-16T19:15:30.613 に答える