C++ 模板类中函数的模板参数

C++ 模板类中函数的模板参数,c++,templates,C++,Templates,我有这样的情况 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

我有这样的情况

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);
  }
};
模板类向量{
T*数据;
单位尺寸,单位计数器;
公众:
类迭代器;
模板向量(类型名C::迭代器it1,
类型名C::迭代器(it2){
数据=空;
_大小=_计数器=0;
对于(typename C::Iterator it=it1;it!=it2&&it!=end();it++)
推动(*it);
}
};
这是我自己的Vector类,构造函数模仿Vector的行为(u可以使用Interator提供的数据范围来构造它),但增加了容器必须是与正在构造的容器相同类型的模板的要求。我犯了一个错误

5.cpp:16:36:错误:调用“Vector::Vector(Vector::Iterator,Vector::Iterator)”时没有匹配函数 5.cpp:16:36:注:候选人为:从5.cpp:2:0:

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

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

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

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

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

5.hpp:7:25:注:向量::向量(常量向量&)

5.hpp:7:25:注:候选人期望1个参数,提供2个参数

这里需要一些帮助。

在:

 template<template<class> class C> Vector(typename C<T>::Iterator it1,
                                           typename C<T>::Iterator it2) 
模板向量(类型名C::迭代器it1,
类型名C::迭代器(it2)
编译器不会从
typename C::Iterator
推断类型
C
,因为它是所谓的非导出上下文

参见§14.8.2.4从类型[临时扣除类型]中扣除模板参数:

4非派生上下文为:

-使用限定id指定的类型的嵌套名称说明符

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

在:

模板向量(类型名C::迭代器it1,
类型名C::迭代器(it2)
编译器不会从
typename C::Iterator
推断类型
C
,因为它是所谓的非导出上下文

参见§14.8.2.4从类型[临时扣除类型]中扣除模板参数:

4非派生上下文为:

-使用限定id指定的类型的嵌套名称说明符

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


那是什么
模板
?构造函数是带有参数C的模板方法,它本身就是一个带有一个参数名reverelant的模板。
it!=end()
。那不可能是对的。我想您正在定义
类迭代器在函数定义下面?看起来这里有一个不可推断的上下文。简而言之,您无法从
C::iterator
中推断出
C
。它实际上是无用的,你甚至没有提到它在身体的功能。按迭代器类型参数化,而不是按容器类型参数化。那是什么
template
?构造函数是带有参数C的模板方法,它本身就是一个带有一个参数名revirelant的模板。
it!=end()
。那不可能是对的。我想您正在定义
类迭代器在函数定义下面?看起来这里有一个不可推断的上下文。简而言之,您无法从
C::iterator
中推断出
C
。它实际上是无用的,你甚至没有提到它在身体的功能。按迭代器类型参数化,而不是按容器类型参数化。