2011-12-22 81 views
0

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

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

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

我已经试过我的地图上,不给我一个MyClass的错误时,我这样做typedef T::iterator iterator;转发我的迭代器,但它显然并不想对我好时,我想打电话给myIterator->first,因为现在它不相信我会这么做。说实话,我很惊讶地发现我的typedef确实有效。

现在我的问题:是否有一个很好的办法做到我想做的是什么?还是我在这里把自己调到了一个角落?首先十分感谢!

西蒙

一些详细信息:

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

+1

你不需要'的typedef typename的T ::迭代器iterator'?我很惊讶,你说你没有得到'typedef T :: iterator iterator'的错误。 – atkins 2011-12-22 17:08:25

+0

这看起来更好,你是对的,但我没有得到一个错误。如果有人能解释这是为什么会很好。 另外:现在,我已经决定简单地使用'地图',从此我可以访问的元素,并在那一刻,我只有地图。这是,我觉得,虽然相当丑陋,我会很感激任何更好的解决方案:) – simonstuck 2011-12-22 17:25:01

+0

他应该得到一个错误,没有'typename',但不是所有的编译器强制执行此。 – 2011-12-22 17:27:13

回答

1

对于初学者来说,如果你的类模板总是将成为 的map一些实例,我要重复所有的typedef S在 std::map在你的类的包装,每个时间:

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

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

至于到myIterator->first不工作,你必须告诉我 这个地方发生行。应该没有问题,如果它是在你的类模板 功能,因为该功能不应该 实例化,直到它被使用(并通过这种类型的T类型是 知道)。如果它是类模板之外,它应该仍然工作, 提供您正确地声明的变量,像:

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

(在类模板,只是用iterator的类型名称应该 足矣,由于typedef在范围内)。

+0

好的,非常感谢!我在第一篇文章中添加了更多信息。 – simonstuck 2011-12-22 17:45:47