1

次のクラス テンプレートには、2 つのテンプレート引数を持つSequencerネストされたクラス テンプレートが含まれています。Process

template<typename P>
struct Sequencer
{   
    template<typename A , bool = A::CAN_BE_BUFFERED>
    struct Process;
};

次のように、テンプレート引数を 1 つだけサポートするように独自のバージョンを特化しながらSequencer、カスタムに特化したいと考えています。struct FooProcess

template<>
struct Sequencer<Bar>
{   
    template<typename A>
    struct Process;
};

実装が長すぎるので、リスト全体をideoneに投稿しました。

GCC 4.5.3 では、次のエラー メッセージが表示されます。

prog.cpp:60:24: error: partial specialization ‘Sequencer<Bar>::Process<A>’ does not specialize any template arguments

Visual Studio 2008 では、次のエラーが表示されます

prog.cpp(62) : error C2753: 'Sequencer<Bar>::Process<A>' : partial specialization cannot match argument list for primary template
4

1 に答える 1

2

Sequencer<Bar>::Processは完全なテンプレートであり、特殊化ではありません。たまたま専門分野のメンバーになっているだけです。それを特殊化として宣言するべきではありません:

template<typename A>
struct Sequencer<Bar>::Process/*<A>*/
                               //^ remove this
{
};

テンプレートは「クラス ジェネレータ」と考える必要があります。Sequencer<P>は、任意の からクラスを作成する方法を定義します。Pここでは、がインスタンス化Sequencer<Bar>されたときに生成する特定のクラスを指定します。Sequencer<Bar>生成された各クラスは完全に分離されており、関連性はありません (同じジェネレーターによって作成されていることを超えて)。この場合、これは の内部クラスが の内部クラスSequencer<Bar>と関係がないことを意味しSequencer<P>ます。

于 2013-02-07T18:03:17.753 に答える