【问题标题】:template argument for a function in template class模板类中函数的模板参数
【发布时间】:2013-04-12 03:58:00
【问题描述】:

我有这样的情况

template<class T> class Vector {
  T *data;
  uint _size, _counter;
public:
  class Iterator;
  template<template<class> class C> Vector(typename C<T>::Iterator it1,
                                           typename C<T>::Iterator it2) {
    data = NULL;
    _size = _counter = 0;
    for(typename C<T>::Iterator it = it1; it != it2 && it != end(); it++)
      push(*it);
  }
};

那是我自己的 Vector 类,构造函数模仿了 vector 的行为(你可以使用交互器提供的数据范围来构造它),但添加了容器必须是与正在构建的容器相同类型的模板的要求。我得到错误

5.cpp:16:36: 错误:没有匹配函数调用‘Vector::Vector(Vector::Iterator, Vector::Iterator)’ 5.cpp:16:36:注意:候选人是:在 5.cpp:2:0 中包含的文件中:

5.hpp:17:37: 注意:模板类 typedef C C> Vector::Vector(typename C::Iterator, typename C::Iterator)

5.hpp:17:37:注意:模板参数推导/替换失败:

5.cpp:16:36:注意:无法推断模板参数“模板类 typedef C C”在包含自 5.cpp:2:0 的文件中:

5.hpp:11:3: 注意:Vector::Vector() [with T = int]

5.hpp:11:3: 注意:候选人需要 0 个参数,提供 2 个

5.hpp:7:25: 注意:Vector::Vector(const Vector&)

5.hpp:7:25: 注意:候选人需要 1 个参数,提供 2 个

在这里需要一些帮助。

【问题讨论】:

  • template&lt;template&lt;class&gt; class C&gt; 是什么?
  • 构造函数是带有参数 C 的模板方法,它本身就是一个带有一个参数名称无关的模板。
  • it != end()。这不可能。
  • 我想你是在函数定义下面定义class Iterator;
  • 看起来你这里有一个不可演绎的上下文。简而言之,您无法从C&lt;T&gt;::iterator 中推断出C。它实际上是没有用的,你甚至没有在函数体中提到它。通过迭代器类型参数化,从不通过容器类型。

标签: c++ templates


【解决方案1】:

在:

 template<template<class> class C> Vector(typename C<T>::Iterator it1,
                                           typename C<T>::Iterator it2) 

编译器不会从typename C&lt;T&gt;::Iterator 推断出类型C,因为它是所谓的非推断上下文

参见 §14.8.2.4 从类型 [temp.deduct.type] 推导模板参数:

4 未推断的上下文是:

— 使用限定 ID 指定的类型的嵌套名称说明符。

— 一种模板 ID 类型,其中一个或多个模板参数是引用模板参数的表达式。

【讨论】:

    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 2013-08-02
    • 2018-12-05
    • 2011-05-27
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多