3

以下のコードのコンパイル中に次のエラーが発生します。私は混乱していて、ここで何が間違っているのか理解できません。メンバ関数ポインタの逆参照が間違っていませんか?

エラー:

#g++ fp.cpp
fp.cpp: In member function âvoid Y::callfptr(void (X::*)(int))â:
fp.cpp:33: error: no match for âoperator->*â in âpos ->* opâ

fp.cpp

#include <iostream>
#include <vector>
using namespace std;

class B {
 // some base class
};

class X : public B {
 public:
  int z;
  void a(int a) {
    cout << "The value of a is "<< a << endl;
  }
  void f(int b) {
    cout << "The value of b is "<< b << endl;
  }
};

class Y : public B {
 public:
  int b;
  vector<X> vy;
  void c(void) {
   cout << "CLASS Y func c called" << endl;
  }
  void callfptr( void (X::*op)(int));
};

void Y::callfptr(void (X::*op) (int)) {
 vector<X>::iterator pos;
 for (pos = vy.begin(); pos != vy.end(); pos++) {
  (pos->*op) (10);
 }
}
4

2 に答える 2

5

これを行う代わりに:

(pos->*op) (10);

これを行う:

((*pos).*op)(10);

イテレータは のオーバーロードを提供する必要はありませんoperator ->*operator ->*の代わりに本当に使用したい場合は、次のoperator .*ようにします。

((pos.operator ->())->*op)(10)

しかし、これはより冗長です。

ユースケースに関連する可能性のある違いは、演算子->*をオーバーロードできるのに対し、オーバーロードoperator .*できないことです。

于 2013-04-24T10:52:42.407 に答える
3

->*ですoperator ->*。使用できます

pos.operator->()->*op

または単に

(*pos).*op
于 2013-04-24T10:53:26.223 に答える