Я не думаю, что вы можете специализировать вложенный шаблон без полной специализации вмещающего:
template<class T>
struct A {
template<class U>
struct B {};
};
template<>
template<>
struct A<int>::B<int> {}; // Okay.
template<>
template<class U>
struct A<int>::B<U*> {}; // Okay.
template<class T>
template<>
struct A<T>::B<int> {}; // error: enclosing class templates are not explicitly specialized
В качестве обходного пути извлеките вложенный шаблон в область файла / пространства имен испециализируйте его как хотите:
// Extracted template.
template <std::size_t Size, typename Tag, typename T>
class the_arena_allocator;
template <std::size_t Size, typename Tag>
class allocator_factory
{
public:
static constexpr std::size_t size = Size;
typedef Tag tag_type;
template <typename T>
using arena_allocator = the_arena_allocator<Size, Tag, T>;
};
// A partial specialization of the extracted template.
template <std::size_t Size, typename Tag>
class the_arena_allocator<Size, Tag, void> { /* ... */ };