我目前正在尝试为自定义类构建一个迭代器,但它并不是特别好:我遇到的问题是我的自定义类使用模板看起来像这样:
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
时,会发生错误。
答案 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
在范围内。)