17

以下のコードは、VC++ 2012 によって「エラー C2207: 'A::bar': クラス テンプレートのメンバーは関数型を取得できません」で拒否されます。

int Hello(int n)
{
    return n;
}

template<class FunctionPtr>
struct A
{
    A(FunctionPtr foo)
        : bar(foo)
    {}

    FunctionPtr bar;
};

int main()
{
    A<decltype(Hello)> a(Hello);

    return 0;
}

なんで?

4

3 に答える 3

10

gcc は、このエラーに関してもう少しフレンドリーです:

error: field 'A<int(int)>::bar' invalidly declared function type

bar最も簡単な解決策は、関数ポインタとして宣言することです:

FunctionPtr *bar;

この場合、はnotとdecltype(Hello)評価されます。int(int)int(*)(int)

于 2012-11-05T14:00:28.790 に答える
6

変数に関数型を含めることはできません。関数ポインタ型ではなく、which is which is which は に評価されると宣言barします。FunctionPtrdecltype(Hello)int (int)

C から継承されたいくつかの不整合のため、混乱を招きます。コンストラクターAを a を取るものとして定義するFunctionPtrと、同じエラーが発生することを想像するかもしれません。ただし、配列または関数型を持つと宣言された関数パラメーターは、自動的に (残念ながら、不便なことに) ポインター型に変換されます。したがってfoo、関数型を持つと宣言されていても、実際には関数ポインター型を持ち、正常に動作します。

しかし、この規則は関数パラメータにのみ適用され、他の変数には適用されないため、bar実際には関数型があり、これは正しくありません。

于 2012-11-05T16:12:57.130 に答える