Определения параметров внутри CONT на самом деле не используются компилятором. Параметр шаблона-шаблона CONT на самом деле похож на функцию, которая принимает 2 типа ввода и возвращает новый тип:
// pseudo code
type Stack(type T, type(*CONT)(type ELEM, type ALLOC = etc)) {
return CONT(T);
}
и, как и обычные объявления указателей на функции, имена ELEM, ALLOC фактически игнорируются компилятором.
То, что видит компилятор, будет просто
template <typename T,
template <typename E, typename = std::allocator<E> > class CONT = std::vector>
struct Stack { ... };
Следовательно, вы не можете использовать ALLOC вообще.
Так, чтобы решить это? Ну, вы передаете дополнительный параметр! Как и в случае с обычной функцией C ++:
// pseudo code
type Stack(type T, type(*CONT)(type, type), type ALLOCATOR = etc) {
// ^^^^^^^^^^^^^^^^^^^^
return CONT(T, ALLOCATOR);
}
Соответствующее фактическое объявление шаблона будет
template <typename T,
template <typename, typename> class CONT = std::vector,
typename ALLOCATOR = std::allocator<T> >
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
struct Stack {
...
CONT<T, ALLOCATOR> elems;
};
//...
Stack<int, std::vector, std::allocator<int> > s;