Что обозначает такое создание обьекта: SmartPointer sp?
Есть типы(классы)-"дженерики", их функционал зависит от типа шаблона, например класс Array<T>, где T - какой-либо тип, скажем, Array<int> - это будет массив int'ов, Array<std::string> - массив std::string'ов и т.д., в данном случае класс SmartPointer<Foo> sp; реализует "умный указатель" вида Foo* sp;И еще, как указатель может быть void: std::ptrdiff_t operator -(void *p) это что, ссылка на ничего? 
void* - "универсальный" тип указателя, к нему можно привести указатель любого типа, также как и к int, где в int будет число - адрес (номер ячейки) в памяти, где содержатся данные, на которые вы указываете.
В угловых скобках указываются параметры шаблона.
О шаблонах рассказано с первых страниц любой книги для чайников.