I agree. No sense in throwing an exception over a full queue. I would say that by default, the queue should allow an unlimited number of items unless a limit is set. So here are some additions:

Code:

template <class T>
struct queue {
~queue();
queue();
queue(const queue & replicate);
template <class Iter>
queue(const Iter & _begin, const Iter & _end);
queue & copy(const queue & replicate);
// fill with values from another type of container:
template <class Iter>
queue & copy(const Iter & _begin, const Iter & _end);
// returns a dynamically allocated copy:
queue * clone() const;
T & front() const;
T & back() const;
T & push(const T & value, bool then_pop = true);
void pop();
unsigned count() const;
bool empty() const;
// full() only returns true if max(unsigned) was set:
bool full() const;
// max returns zero if unlimited, otherwise...
unsigned max() const;
void max(unsigned set);
};