STL queue implementation
A few points that nearly jump out at me:


You've implemented it as a linked list of individually allocated nodes. This nearly guarantees poor locality of reference and for small types wastes quite a bit of space.
Your destructor leaks memory:

template &lt;typename T&gt;
queue&lt;T&gt;::~queue() {
    node *curr = new node();
    while(head) {
        curr = head;


This allocates a node (not clear why you'd want to allocate a node in the dtor, but there it is), then if head != nullptr, it overwrites that pointer with head, thus leaking the node it just allocated (and if that condition isn't met, it just flows off the end without doing any more with curr, also leaking the memory).
Your node type takes for granted that a T can be initialized from 0:

node()
    : data(0)


For a generic type, this assumption is unwarranted. You typically want to use T() to create a value-initialized object, which will be 0 for arithmetic types, a null pointer for a pointer type, an empty string for a string type, and so on.