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