【问题标题】:Simultaneously specializing outer and nested class同时特化外部类和嵌套类
【发布时间】:2013-02-07 17:48:39
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 2019-07-29
      • 2016-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多