2

これはおそらく初歩的なものです。引数のないタイプの関数へのポインタを取るcell識別子を持つ1つのクラス(と呼ばれる)の関数( )(これは I )を持っています。別のクラスでは、 のオブジェクトがあり、メソッドを使用します。許可されません。上記のタイトルでエラーが発生します。これら 2 つの関数がクラス内に埋め込まれていない場合は、正常に動作します。woo_func_ptrvoidvoid (*void_ptr)(void)typedefcellwoo_func_ptr

typedef void (*void_ptr)(void);



double WOO{0};

struct cell {
void woo_func_ptr(void_ptr jo)
{
    jo();
}
};


class woosah
{
public:
void woo_func()
{
    WOO+=rand();
    std::cout << WOO << std::endl;
};

void run()
{
    // other stuff
    temp_cell.woo_func_ptr(woo_func);
    // yet more stuff
}

cell temp_cell;
};
4

4 に答える 4

3

まず、woosah メンバー関数へのポインターを次のように宣言する必要があります。

  typedef void (woosah::*void_ptr)(void);

コンパイラは、このステートメントの解析中にwoosah定義を確認する必要があると不平を言います。

コンパイラにクラス woosah を最初に上に移動して解析させると、タイプ cell が定義されていないと文句を言います (woosah に含まれているため)。解析中の循環依存のため、それでも問題は解決しません。

循環依存を解決する 1 つの方法は、temp_cellをセル インスタンスへのポインターにし、woosah 内に含めることです。

また、メンバー関数を呼び出す構文は、.* または ->* を使用することにも注意してください。

      void run()
      {
          // other stuff
          temp_cell->woo_func_ptr(temp_cell->*woo_func); // assuming temp_cell is pointer to some cell instance
         // yet more stuff
       }
于 2013-03-28T01:20:23.880 に答える
2

http://msdn.microsoft.com/en-us/library/b0x1aatf(v=vs.80).aspxは、同様のエラーとその修正を示しています。

于 2013-03-28T01:11:04.080 に答える
2

メンバー関数は通常の関数とは異なります。そのため、別の「メンバー関数へのポインター」タイプがあります。これは、メンバー関数に暗黙のthisポインターが渡されるためです。

実際、標準では、メンバー関数へのポインターのキャストを (厳しく) 制限しています。

それがあなたのエラーの原因です。

于 2013-03-28T00:51:44.003 に答える
1

静的クラス関数を使用できます...

変化する

void woo_func()

static void woo_func()

特定のオブジェクトのデータ メンバーにアクセスしようとしている場合、これは粗雑な意図ではない可能性があります。

メンバー関数は特殊なものであり、通常の関数として扱われるべきではありません。

于 2013-03-28T01:16:33.377 に答える