69

メンバー関数ポインターを使用してテストを実行しようとしています。このコードの何が問題になっていますか?ステートメントはコンパイルされbigCat.*pcat();ません。

class cat {
public:
   void walk() {
      printf("cat is walking \n");
   }
};

int main(){
   cat bigCat;
   void (cat::*pcat)();
   pcat = &cat::walk;
   bigCat.*pcat();
}
4

2 に答える 2

119

より多くの括弧が必要です:

(bigCat.*pcat)();
^            ^

関数呼び出し(())は、ポインターからメンバーへのバインディング演算子()よりも優先されます.*。単項演算子は、二項演算子よりも優先されます。

于 2012-08-30T02:26:10.903 に答える
8

今日、標準的な方法は、特にジェネリックコードでstd::invoke関数テンプレートを使用することです。メンバー関数ポインタが最初に来ることに注意してください:

import <functional>;

std::invoke(pcat, bigCat);

得られるもの:事実上すべての、呼び出し可能な統一された呼び出し構文。

オーバーヘッド:なし。

于 2021-10-13T19:44:55.297 に答える