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