1

私はVS 2008で作業しています(申し訳ありませんが、更新できません)。リスト クラスのテンプレートの特殊化が必要です。特化したい引数はメンバ関数ポインタです。

要するに、次のコードを機能させるにはどうすればよいですか (可変個引数テンプレートを使用できます):

// two or three args
template <typename T1, typename T2, void (T1::* FUNC)(const T2&) = 0> struct list;
// specialized code for 2 args.
template <typename T1, typename T2> struct list<T1, T2> { };

エラーメッセージは次のとおりです。

C2754: 'specialization' : 部分的な特殊化には、依存型の非型テンプレート パラメーターを含めることはできません

たぶん、私の問題の解決策はありません。しかし、それも答えです。

事前にご協力いただきありがとうございます。

4

1 に答える 1

2

あなたが達成しようとしていることを私が正しく理解していれば、それはできません. 違法な特殊化のさらに単純なケースを考えてみましょう:

template <typename T1, typename T2, void (T1::* FUNC)(const T2&)> struct list;
template <typename T1, typename T2> struct list<T1, T2, 0> { };

ここでは、テンプレートをインスタンス化するために常に 3 つの引数を指定する必要があり、最後の引数が null ポインターである場合に備えてプライマリ テンプレートを特殊化しようとします。

C++ 標準の§ 14.5.5/8によると:

「特殊化された非型引数に対応するテンプレート パラメータの型は、特殊化のパラメータに依存してはなりません。[例:

template <class T, T t> struct C {};
template <class T> struct C<T, 1>; // error

template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error

— 例の終了 ] "

テンプレート パラメーター リスト内の他の型に依存する型の非型引数を特殊化することはできません。したがって、上記の専門化は違法です。

元の設計は、この特殊化の特定のケースにすぎません。最後の (型ではない) パラメーターには、特殊化で省略した既定の引数値があります (省略自体は正当です)。これが違法である理由は、デフォルトの引数の存在とは関係ありませんが、依存する type を持つ非型引数を特殊化しようとしているという事実に関係しています。

于 2013-01-16T13:57:57.020 に答える