template <
typename T,
template <class> class OwnershipPolicy = RefCounted, #1
class ConversionPolicy = DisallowConversion, #2
template <class> class CheckingPolicy = AssertCheck,
template <class> class StoragePolicy = DefaultSPStorage
>
class SmartPtr;
Q1 &GT;第#1行的语法是什么
template <class> class OwnershipPolicy = RefCounted,
为什么它不提供如下参数?
template <class T2> class OwnershipPolicy = RefCounted,
Q2 &GT; #1 和#2 之间有什么区别?
template <class> class OwnershipPolicy = RefCounted,
class ConversionPolicy = DisallowConversion,
为什么其中一行有template<class>
而另一行没有?
答案 0 :(得分:4)
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
值得注意的是,这个成语被称为“基于政策的设计”。