The forward declaration of STL library class std::queue is as follows:
namespace std {
template<typename T, class container = deque<T>> class queue
}
That means we can declare an object of type queue with different type specifications like this:
std::queue<float, std::deque<std::string>> string_queue;
Why this is possible? Wouldn't it be much more type safe to declare queue like this:
template<class implementation>
class queue_base
{
private:
implementation m_impl;
/* ----------------------------------------------------------- */
public:
typedef implementation container_type;
typedef typename implementation::size_type size_type;
typedef queue_base<implementation> this_type;
typedef typename implementation::value_type value_type;
/* ----------------------------------------------------------- */
queue_base ();
queue_base (queue_base const& other);
explicit queue_base(container_type const& other);
/* ----------------------------------------------------------- */
value_type& back ();
value_type const& back () const;
bool empty() const;
value_type& front();
value_type const& front() const;
void pop ();
void push (value_type const& value);
size_type size () const;
/* ----------------------------------------------------------- */
}; /* template<class> class queue_base */
/* --------------------------------------------------------------- */
Most implementations of std::queue I have seen implement 'value_type' and 'size_type' in the same manner as you can see in my code above. So, template parameter 'T' is only been used for the default parameter of template parameter 'container' (std::deque).
I mean, I don't think it's "fine" that the float specification in declaration example above is ignored; no matter it works or not.