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