template <class> class OwnershipPolicy
- аргумент шаблона шаблона.Т.е. ожидается, что OwnershipPolicy
будет шаблоном, принимающим один (и только один) аргумент типа.У этого аргумента нет названия, потому что он не нужен, и вы все равно не сможете его использовать.
class ConversionPolicy
эквивалентно typename ConversionPolicy
, то есть любому аргументу обычного типа.
Разница заключается в том, как вы его используете.Для аргументов шаблона вы указываете только имя шаблона, которое вы можете использовать позже для создания конкретных типов.Для typename
вам нужен конкретный тип:
template <typename A, template <typename> class B>
struct foo {};
template <typename T>
struct x {};
struct y {};
template <typename T, typename U>
struct z {};
// both of these are valid:
foo<x<int>, x> a;
foo<y, x> b;
// these are not:
foo<y, x<int>> c;
foo<y, y> d;
foo<y, z> e; // z has two template arguments, B must have only one
Стоит отметить, что эта идиома называется «разработка на основе политики».