在阅读this thread之后,我写下了:
template <typename T, template <T> typename C>
class Base
基类包含&#39; C
&#39;包含&#39; T
&#39;的类型容器类型对象。
我的问题是当我尝试创建派生类时:
class Derived : public Base
第一个错误是
缺少类模板的参数列表。
所以我想我必须告诉模板Base
类我将使用哪种类型。因此,假设我的派生类将有一个&#39; std::set
&#39;对于具有整数的容器。
class Derived : public Base <int, set<int>>
但它&#39; std::set<int>
&#39;用红色加下划线,它告诉我它不是模板类&#34;。
我不确定我做错了什么。
提前致谢。
答案 0 :(得分:1)
模板类型名称C&gt; class Base
基类包含一个包含'T'类型对象的'C'类型容器。
C
不是std::set
之类的容器。我的意思是:C
没有收到模板类型参数作为STL容器。
使用Base
,您可以写
template <int>
struct foo
{ };
template <typename T, template <T> typename C>
class Base
{ };
class Derived : public Base <int, foo>
{ };
其中foo
接收整数,而不是类型。
如果您想要std::set
作为第二个参数,可以写
template <typename T, template <typename...> typename C>
class Base
{ };
其中C
收到可变参数类型列表(std::set
接收三个模板类型参数;第二个和第三个默认为默认值。
所以你可以写
class Derived : public Base <int, std::set>
{ };
另一种方法是将Base
写为接收单一类型并使用部分特化来解析容器和容器模板参数
template <typename>
class Base;
template <template <typename...> typename C, typename A0, typename ... As>
class Base<C<A0, As...>>
{ };
因此您可以直接传递类型std::set<int>
(使用默认模板类型),如下所示
class Derived : public Base <std::set<int>>
{ };