我是一名新的C++程序员,不久前我学习了Java和ANSI C,并决定试一试。
嗯,我喜欢C++,但我不喜欢迭代器的工作方式:
在java中,可以将整个容器设为私有容器,并为其迭代器实现getter函数,迭代器有一个方法hasNext()
,该方法根据是否到达容器的末尾返回布尔值。
我发现在C++上做类似事情的唯一方法是写两个getter,iteratorBegin()
和iteratorEnd()
,它们返回一个与第一个和最后一个位置相对应的interator,递增iteratorBegin()
返回的迭代器并将其与iteratorEnd()
进行比较,使我能够在容器上迭代,直到到达最终位置
但是,我只想使用一个getter方法,我想:"让我们制作我自己的迭代器类"
到目前为止,我已经成功地使用了集合和列表,但我似乎无法使用映射,这是困扰我的代码:(该类在单独的.h中定义,这被称为customIterator.cpp)
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;
}
在编译专用方法时,它会说:error:未在此范围内声明"map"即使我在文件的顶部添加了#include <map>
我使用gcc版本4.4.5(Debian 4.4.5-8)和代码块
求你了,我需要一些帮助。
感谢您的关注!
所有标准容器都在名称空间std内,您应该将其限定为
std::map<T,D>
一般来说,我建议不要试图将Java习语移植到C++中,因为每种语言都有自己的习语,混合使用它们会让其他程序员感到困惑(就像我认为#define BEGIN {
不是最好的主意一样)。
你试图做的是范围,一些人认为这是比C++迭代器更好的解决方案,但在它进入语言之前,我认为每个开发人员发明自己的范围是有害的。
进一步阅读或tl;dr幻灯片(有一个视频,我现在找不到)。