【问题标题】:C++ - Template template parameter with default argument doesn't workC++ - 具有默认参数的模板模板参数不起作用
【发布时间】:2015-06-09 12:59:36
【问题描述】:

所以我有一个类的形式:

template <typename T, template <typename T> class Container = std::vector>
class MyArray : Container<T>
{
    ...
}

现在我正在尝试将其实例化为

template <typename T>
class MyClass
{
    MyArray<T> array;
}

这会产生错误:

error: type/value mismatch at argument 2 in template parameter list for 'template<class T, template<class T> class Container> class MyArray'
MyArray<T> y;

它指向MyArray&lt;T&gt;&gt;

这有什么问题?为什么我不能有默认模板参数?

谢谢。

【问题讨论】:

  • 我认为你不能在没有任何模板参数的情况下解决std::vector,你试过template &lt;typename T, template &lt;typename T&gt; class Container = std::vector&lt;T&gt;&gt;吗?
  • @DavidHaim 实际上这是可能的,这(我认为)不是问题的根源。不过,是的,我试过了。实际上我开始认为问题在于我必须解决 std::vector 的分配器模板参数。
  • 另外,你最好在template &lt;typename T&gt; class Container 中使用不同于T 的东西,clang 也会在这种情况下警告阴影。
  • @Predelnik 实际上使用T 是故意的,因为我希望它的模板参数与用户提到的第一个模板参数匹配。我希望这没有错,因为我前一阵子试过(不记得细节了)。
  • @TheQuantumPhysicist 你想要一些模板模板参数,它是一个没有指定模板参数的类模板,你稍后在class MyArray : Container&lt;T&gt; 中指定它们,你甚至可以删除那个 T 以避免混淆,它没有实际上很重要。

标签: c++ class templates template-templates


【解决方案1】:

问题在于std::vector 采用两个模板参数:类型和分配器。许多其他容器类型将采用额外的策略参数,这些参数具有默认值,允许您实例化,例如 T&lt;U&gt;

为了支持这一点,你可以说你的模板模板参数应该至少使用可变参数模板(typename...)的一个模板参数:

template <typename T, template <typename, typename...> class Container = std::vector>
class MyArray : Container<T>
{
    ...
}

【讨论】:

  • 感谢您尝试回答。是的,这开始掩盖问题......但仍然不是完整的解决方案。我仍然在Container&lt;T&gt; 部分遇到错误,它说应该有 2 个参数,并且简单地添加我在模板模板参数中提到的分配器参数不起作用。
  • 你的意思是template&lt;class T, template&lt;typename T, typename... Args&gt; class MyArray : Container&lt;T, Args...&gt;
  • @TemplateRex 是的,Args 部分说它没有在这个范围内声明(即使它在 args 中提到过)。
  • @TartanLlama 请尝试使用MyClass&lt;double&gt; myarray 实例化一个对象。
  • @TheQuantumPhysicist 像 works for me 那样实例化它。
猜你喜欢
  • 2015-02-04
  • 2011-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2020-06-01
  • 2015-05-09
  • 2018-10-12
相关资源
最近更新 更多