1

基本的に、dif関数を使用して、クラス(ac)の別の要素を抽出したいと思います。

コードは次のようになります。

.h:

class MyClass
{
  public:
    double f1(AnotherClass &);
    void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &));
};

.cc:

double MyClass::f1(AnotherClass & ac)
{
  return ac.value;
}

void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &))
{
  std::cout << f1(ac);
}

動作しませんでした。エラー#547「メンバー関数のアドレスを取得するための非標準形式」が表示されます。

編集:

私はそれをから呼びます:

void MyClass(AnotherClass & ac)
{
  return f0(ac,&f1);  // original and incorrect
  return f0(ac,&Myclass::f1); //solved the problem
}

ただし、別のエラーがあります。

std::cout << f1(ac); 
             ^ error: expression must have (pointer-to-) function type
4

2 に答える 2

4

エラーポイントの場所を確認します。それは関数宣言行ではなく、どのように呼び出すかということだと思います。

観察:

struct foo
{
    void bar(void (foo::*func)(void));
    void baz(void)
    {
        bar(&foo::baz); // note how the address is taken
        bar(&baz); // this is wrong
    }
};

関数を誤って呼び出しているため、エラーが発生しています。上記のことを考えると、fooこれは機能しないことがわかっています。

baz(); // where did the foo:: go?

bazインスタンスを呼び出す必要があるためです。あなたはそれに1つ与える必要があります(私は仮定しますthis):

std::cout << (this->*f1)(ac);

構文は少し奇妙ですが、この演算子->*は次のように述べています。「右側のメンバー関数ポインターを取得し、左側のインスタンスで呼び出します。」(オペレーターもい.*ます。)

于 2010-08-17T19:36:57.330 に答える
1

エラーの原因と思われるメンバーへのポインターを作成するコードをまだ投稿していませんが、使用方法に問題があります。

メンバーへのポインターを使用するには、クラスの適切なインスタンスへのポインターまたは参照と共に->*or.*演算子のいずれかを使用する必要があります。例えば:

void MyClass::f0(AnotherClass & ac, double(MyClass::*f1)(AnotherClass &))
{
  std::cout << (this->*f1)(ac);
}

次のように関数を呼び出すことができます。

void f()
{
    AnotherClass ac;
    MyClass test;
    test.f0( ac, &MyClass::f1 );
}

&暗黙的に関数ポインタに変換される通常の関数名とは異なり、メンバへのポインタには が必要であることに注意してください。

于 2010-08-17T19:49:53.333 に答える