1. ホーム
  2. c++

[解決済み] 非静的メンバ関数の無効な使用 c++

2022-01-29 20:14:10

質問

私は次のことを行っています。 . しかし、コンパイルするとエラーが返されます。

非静的メンバ関数の無効な使用

行目に

void(Machine:: *ptrs[])() = 
  {
    Machine::off, Machine::on
  };

を追加しようとしたのですが staticvoid on(); クラスで

class Machine
{
  class State *current;
  public:
    Machine();
    void setCurrent(State *s)
    {
        current = s;
    }
    static void on(); // I add static here ...
    static void off(); // and here
};

しかし、次のように文句を言われます。

静的メンバ関数でのメンバ Machine::current の無効な使用

これを修正するのを手伝ってもらえますか?

解決方法は?

静的メンバ関数やフリー関数とは異なり、非静的メンバ関数では、以下のようなことは起こりません。 暗黙のうちに変換する をメンバー関数ポインタに変換します。

(強調)

関数型のlv値 T は暗黙のうちにその関数への prvalue ポインタに変換することができます。 これは非静的メンバ関数には適用されません。 なぜなら、非静的メンバ関数を参照するlvalueは存在しないからです。

そのため & 非静的メンバ関数のアドレスを取得する (非静的メンバ関数のポインタを取得する) ために明示的に行う。

void(Machine:: *ptrs[])() = 
  {
    &Machine::off, &Machine::on
  };

静的メンバ関数として宣言した場合、その型は ptrs (非メンバー関数ポインタの配列に)。静的メンバ関数には & を明示的に指定します。

void(*ptrs[])() = 
  {
    Machine::off, Machine::on
  };