3

私はこの小さなコードを持っています:

int add(int x, int y)
{
    return x + y;
}

class A
{
public:
    const static int (*FP)(int, int) = &add;
};

int main()
{
    int x = 3;
    int y = 2;
    int z = A::FP(x, y);
    return 0;
}

VS2012 では、これにより次のエラーが生成されます。

私が見ていないものはありますか?それとも、何らかの理由で明らかに不可能ですか?

キリスト教徒

4

3 に答える 3

3

ネスを可能typedefにするためにa を使用して、クラス定義の外で初期化します。const

typedef int (*func_t)(int, int);

class A
{
public:
    const static func_t FP;
};

const func_t A::FP = &add;

typedef宣言なし:

const static int (*FP)(int, int) = &add;

は、static関数ポインターではなく、FP戻り値の型で名前が付けられた関数ポインターです。warnling レベルでコンパイルすると、次の診断メッセージが出力されます。const intconst/W4

警告 C4180: 関数型に適用された修飾子には意味がありません。無視された

const static intの代わりに、宣言の順序が原因で、これはすぐにはわかりませんでしたstatic const int

于 2013-05-09T10:03:58.003 に答える
1

C++03 で。non-intgeralorのクラス初期化はenum data-types許可されていません。

class A
{
public:
    typedef int (*FP_ptr)(int, int);
    const static FP_ptr FP;
};

const A::FP_ptr 
A::FP = &add;

C++11

class A
{
public:
    constexpr static int (*FP)(int, int) = &add;
};
于 2013-05-09T10:06:56.353 に答える
0

どうもありがとう、みんな。私は最近、ほとんど同じ問題を抱えていました。新しいタイプを宣言せずに、適切な場所に「const」を使用して回答を追加したいだけです。

class A
{
public:
    static int (* const FP)(int, int);
};

int (* const A::FP)(int, int) = &add;

最後の行を次のように変更しても問題ありません (まったく同じかどうかはわかりませんが、機能します)。

int (* const A::FP)(int, int) = add;

他の方法 (他の人が同様の問題を解決する方法) は次のようになります。

class A
{
public:
    static int FP(int, int);
};

int A::FP(int x, int y)
{
    return add( &x, &y );
}
于 2014-07-08T13:25:24.877 に答える