Логически, можно ожидать что-то вроде:
template<typename T, template<typenameU> class C = std::deque>
class queue
{
protected:
C<T> c;
public:
// ...
};
Проблема в том, что std::deque
не будет соответствовать аргументу шаблона, потому что на самом деле:
template<typename T, typename Allocator = allocator<T> >
class deque ...
Дополнительный аргумент шаблона не позволяет ему работать.И если дополнительный аргумент был добавлен ко второму параметру queue
, то большинство пользовательских контейнеров не может быть использовано, потому что у них не будет второго аргумента.Текущее решение обходит эту проблему (хотя все еще позволяет клиентскому коду создавать экземпляр std::queue<float>
, например, не беспокоясь о базовом типе контейнера).
И в конце концов, почему бы и нет?Ваш пример std::queue<float,
std::deque<std::string> >
, вероятно, не скомпилируется, но что не так с чем-то вроде std::queue<bool, std::vector<char> >
(избегая проблемных std::vector<bool>
)?Пока есть неявное преобразование в обоих направлениях, клиент должен убедиться, что он делает то, что хочет.(На практике, конечно, это почти никогда не проблема, потому что в коде клиента редко указывается контейнер.)