模板的自定义迭代器

时间:2011-12-22 16:57:37

标签: c++ templates iterator

我目前正在尝试为自定义类构建一个迭代器,但它并不是特别好:我遇到的问题是我的自定义类使用模板看起来像这样:

template<class T>
class MyClass {
private:
    T memberVar;
};

现在,MyClass基本上是memberVar的包装器,目前它是地图或地图地图。现在,我想在另一个类中创建一个迭代器并使用它做有用的事情,即访问我的地图或地图中的元素。

我已经尝试从我的地图转发我的迭代器,当我做typedef T::iterator iterator;这样的事情时,它在MyClass中没有给我一个错误,但是当我想要时它显然不想对我好致电myIterator->first,因为现在它不再相信我会这样做。说实话,我很惊讶地发现我的typedef确实有效。

现在我的问题:有什么好方法可以做我想做的事情吗?或者我在这里操纵自己?非常感谢提前!

西蒙

更多信息:

在ClassA中,我实例化一个ClassB,然后继承具有正确类型T的MyClass。 然后,在ClassA中我还实例化了一个ClassC,我给出了ClassB的引用。现在,当我尝试在ClassC中创建myIterator并尝试执行myIterator->first时,会发生错误。

1 个答案:

答案 0 :(得分:1)

对于初学者来说,如果你的类模板总是成为一个包装器 map的一些实例化,我将重复所有的typedef 你班上的std::map,每次都有:

typedef typename T::value_type;
// ...

(至少根据标准,typename是必要的,但是 g ++的版本,并使用它编译所有代码,即使你使用了 最终构建的不同编译器。)

关于myIterator->first无效,你必须告诉我们 这条线发生的地方。如果它在a中应该没有问题 函数在类模板中,因为函数不应该 实例化直到它被使用(并且通过该类型,T的类型是 已知的)。如果它在类模板之外,它应该仍然有用, 如果你已正确声明变量,例如:

MyClass<std::map<T1, T2> >::iterator myIterator;

(在类模板中,只需使用iterator作为typename 足够了,因为typedef在范围内。)