Синтаксис параметра шаблона шаблона по умолчанию

Я написал спископодобный шаблонный класс sll (Single Linked List). Теперь я пытаюсь подключить к нему распределитель. У меня есть распределитель по умолчанию, распределитель и распределитель на основе пула, pool_allocator. Они разработаны после интерфейса распределителя STL, но мне нужно добавить количество элементов, которые будет обрабатывать распределитель (max_size), в качестве параметра шаблона. Итак, я сделал следующее.

enum  {Default_1 = 16};         // for example
template <typename T, size_t N = Default_1>
struct allocator {
};

enum  {Default_2 = 32};         // for example
template <typename T, size_t N = Default_2>
struct pool_allocator {
};

Я хочу поддерживать два вида использования клиентом:

1. sll<int>  == implying ==> sll<int, allocator<int, Default_1> >

2. sll<int, pool_allocator<int, 4096> >

Трудность, с которой я сталкиваюсь, заключается в указании распределителя по умолчанию в классе шаблонов sll. Изначально у меня было

template<typename T, typename Allocator = allocator<T> > class sll { ...};

Это работает, но проблема в том, что пользователь не может указать емкость распределителя.

Я пытался

template<typename T, 
    typename Allocator = allocator< typename T, size_t N = Default_3> >
class sll { ... };

но я получаю сообщение об ошибке:

error: template argument 1 is invalid

Я попробовал несколько других комбинаций, но ни одна из них не сработала. На данный момент у меня нет идей, и я ищу помощи от сообщества SO. Любые предложения или указатели приветствуются.


person Arun    schedule 31.01.2011    source источник


Ответы (1)


Вы должны написать:

template<typename T, 
    typename Allocator = allocator<T, Default_3> >
class sll { ... };
person mattia.penati    schedule 31.01.2011
comment
+1: Спасибо. Это было просто, я пропустил самый простой вариант :-(. Дополнительный вопрос: Внутри шаблона класса sll, как мне получить доступ ко второму аргументу шаблона Распределителя (обратите внимание на заглавную букву A)? - person Arun; 01.02.2011
comment
Вы можете определить статическую константу внутри класса распределителя, например enum{ size = ...; }. Таким образом, вы можете получить к нему доступ как Allocator::size. Но вы должны определить константу size внутри всех распределителей. Или вы можете использовать черты. - person mattia.penati; 01.02.2011
comment
Спасибо, я также подумал о подходе static const. - person Arun; 01.02.2011