added include guards to smart pointer template