以下类模板Sequencer
包含一个嵌套的类模板Process
,带有两个模板参数。
template<typename P>
struct Sequencer
{
template<typename A , bool = A::CAN_BE_BUFFERED>
struct Process;
};
我想专门定制一个
Sequencer
的struct Foo
,同时专门化自己的Process
的版本以仅支持一个模板参数,如下所示template<>
struct Sequencer<Bar>
{
template<typename A>
struct Process;
};
由于实现时间太长,我将整个 list 发布在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
最佳答案
Sequencer<Bar>::Process
是完整的模板,它不是特化的。它恰好是专业 Realm 的成员。您不应该将其声明为专业:
template<typename A>
struct Sequencer<Bar>::Process/*<A>*/
//^ remove this
{
};
模板应被视为“类生成器”。
Sequencer<P>
定义了一种从任意P
生成类的方法,其中Sequencer<Bar>
给出了在实例化Sequencer<Bar>
时生成的特定类。每个生成的类都是完全独立且不相关的(除了由同一生成器创建之外)。在这种情况下,这意味着Sequencer<Bar>
中的内部类与Sequencer<P>
中的内部类没有关系。