1

私はこの宣言を持っています

struct Z {
    void operator ()( int a ) {
        cout << "operator()() " << a << endl;
    }
};

Z oz, *zp = &oz;

oz(1); //ok
(*zp)(2); //ok
zp(3); //"error: 'zp' cannot be used as a function"

構造体宣言を変更して、No。3の呼び出しが成功するようにする方法はありますか?

4

2 に答える 2

5

これは予想される動作です。zpはポインタ(a Z *)であり、ではなく、operator()に対してオーバーロードされます。ポインタを。で参照すると、がオーバーロードされます。ZZ **zpZ &operator()

残念ながら、ポインター型の演算子をオーバーロードすることはできません(ポインターがユーザー定義型ではないという事実と関係があると思いますが、目の前に標準がありません)。参照を使用して構文を簡略化できます。

Z & r = *zp;
r(3);
于 2011-12-22T04:33:42.260 に答える
0

タイプZに状態がない場合は、関数に変更できます。

typedef void Y(int);
void y( int a ) {
  cout << "y() " << a << endl;
}

Y& oy = y;
Y* yp = &oy;

関数ポインタは呼び出されると暗黙的に逆参照されるため、oy(1)とは両方とも有効です。yp(1)

于 2011-12-22T04:54:47.390 に答える