部分类模板专业化与地图

时间:2012-02-28 14:34:22

标签: c++ templates map iterator partial-specialization

我是一名新的C ++程序员,不久前我学习了Java和ANSI C,并决定试一试。

好吧,我喜欢C ++,但我不喜欢迭代器的工作方式:

在java中,你可以将整个容器设为私有,并为它的迭代器实现一个getter函数,迭代器有一个方法hasNext(),它返回一个布尔值,具体取决于它是否已到达容器的末尾。 / p>

我发现在C ++上做类似事情的唯一方法是编写2个getter,iteratorBegin()iteratorEnd(),它返回一个对应于第一个和最后一个位置的interator,递增{{}返回的迭代器。 1}}并将其与iteratorBegin()进行比较,允许我迭代容器直到达到最终位置

但是,我只想使用一个getter方法,我想:“让我们创建自己的迭代器类”

到目前为止,我已经成功完成了套装和列表,但我似乎无法用地图制作它,这里的代码令我不安:(该类是在一个单独的.h中定义的,这个被称为customIterator.cpp)

iteratorEnd()

在编译专用方法时,它说:错误:'map'未在此范围内声明 即使我在文件顶部添加了template<typename T, typename D> const D& custIterator<T,D>::next() { const D& obj = (*it); if(hasNext()) { it++; } return obj; } //the above works fine template<typename T, typename D> const D& custIterator<map<T,D>,D>::next() //error in this line { D& obj = (*it).second; if(hasNext()) { it++; } return obj; }

我正在使用带有codeblocks的 gcc版本4.4.5(Debian 4.4.5-8)

拜托,我需要一些帮助。

感谢您的关注!

1 个答案:

答案 0 :(得分:5)

所有标准容器都在命名空间std中,因此您应该对其进行限定

std::map<T,D>

总的来说,我建议不要尝试将Java习语带到C ++,因为每种语言都有自己的习语,混合它们会让其他程序员感到困惑(正如我认为#define BEGIN {不是最好的想法)

您尝试做的事情被称为范围并被一些人认为是比C ++迭代器更好的解决方案但是直到它进入语言我觉得它对每个开发人员都有害发明自己的范围。

Further readingtl;dr slides(这里有一段我​​无法找到的视频)。