Следующий шаблон класса 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
Sequencer<Bar>::Process
это полный шаблон, это не специализация. Просто случается так, что он является членом специализации. Вы не должны объявлять это как специализацию:
template<typename A>
struct Sequencer<Bar>::Process/*<A>*/
//^ remove this
{
};
Шаблоны следует рассматривать как «генераторы классов». Sequencer<P>
определяет способ сделать классы из произвольного P
, где Sequencer<Bar>
дает определенный класс для генерации, когда Sequencer<Bar>
создается экземпляр. Каждый сгенерированный класс полностью отделен и не связан (кроме того, что был создан одним и тем же генератором). В этом случае это означает, что внутренний класс в Sequencer<Bar>
не имеет никакого отношения к внутреннему классу в Sequencer<P>
,
Других решений пока нет …