同时专门设计外部和嵌套类

时间:2013-02-07 17:48:40

标签: c++ templates inner-classes template-specialization

以下类模板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

1 个答案:

答案 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>中的内部类没有任何关系。