以下类模板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;
};
由于实施时间过长,我已在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
答案 0 :(得分: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>
中的内部类没有任何关系。