Есть типы(классы)-"дженерики", их функционал зависит от типа шаблона, например класс
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 будет число - адрес (номер ячейки) в памяти, где содержатся данные, на которые вы указываете.