c++ - 同时专门化外部和嵌套类

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

以下类模板 Sequencer 包含一个嵌套类模板 Process,带有两个模板参数。

template<typename P>
struct Sequencer
{   
    template<typename A , bool = A::CAN_BE_BUFFERED>
    struct Process;
};

我想为自定义 struct Foo 专门化 Sequencer,同时专门化其自己的 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

最佳答案

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

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

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

关于c++ - 同时专门化外部和嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14757606/

相关文章:

c++ - 值得在 DTO 中使用 getter 和 setter 吗? (C++)

c++ - 什么是WINVER?

c++ - Windows C - 通过引用将指针传递给使用 MIDL 协议(protocol)的 unsigned char 的动态分配内存

C++ 创建有序链表

c++ - 类型删除和访问器

java - 使用 JAXB 编码内部类 - Java

java - 多态类/多态性/内部类-获取错误信息

c++ - C++ 中的插件框架

不允许 C++ 函数特化?

java - 为什么使用方法局部抽象内部类