1

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

1 回答 1

2

Sequencer<Bar>::Process是一个完整的模板,它不是一个专业化。它恰好是一个专业的成员。您不应该将其声明为专业化:

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

模板应该被认为是“类生成器”。Sequencer<P>定义了一种从任意创建类的方法P,其中给出了在实例化Sequencer<Bar>时生成的特定类。Sequencer<Bar>每个生成的类都是完全分离且不相关的(除了由同一个生成器创建之外)。在这种情况下,这意味着 in 的内部类Sequencer<Bar>与 in 的内部类没有关系Sequencer<P>

于 2013-02-07T18:03:17.753 回答