Одновременно специализирующийся внешний и вложенный класс

Следующий шаблон класса 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

Решение

Sequencer<Bar>::Process это полный шаблон, это не специализация. Просто случается так, что он является членом специализации. Вы не должны объявлять это как специализацию:

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

Шаблоны следует рассматривать как «генераторы классов». Sequencer<P> определяет способ сделать классы из произвольного P, где Sequencer<Bar> дает определенный класс для генерации, когда Sequencer<Bar> создается экземпляр. Каждый сгенерированный класс полностью отделен и не связан (кроме того, что был создан одним и тем же генератором). В этом случае это означает, что внутренний класс в Sequencer<Bar> не имеет никакого отношения к внутреннему классу в Sequencer<P>,

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]