1

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

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

在 java 中,您可以将整个容器设为私有并为其迭代器实现一个 getter 函数,并且迭代器有一个方法hasNext(),该方法根据它是否已到达容器的末尾返回一个布尔值。

我发现在 C++ 上做类似事情的唯一方法是编写 2 个 getter,iteratorBegin()并且iteratorEnd(),它返回一个对应于第一个和最后一个位置的迭代器,递增返回的迭代器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;
}

编译专用方法时,它说:错误:'map'未在此范围内声明,即使我#include <map>在文件顶部添加

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

拜托,我需要一些帮助。

感谢您的关注!

4

1 回答 1

5

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

std::map<T,D>

一般来说,我建议不要尝试将 Java 惯用语移植到 C++,因为每种语言都有自己的惯用语,并且混合使用它们会使其他程序员感到困惑(就像我认为这 #define BEGIN {不是最好的主意)。

您尝试做的事情被称为范围,并且被某些人认为是比 C++ 迭代器更好的解决方案,但在它进入语言之前,我认为每个开发人员发明自己的范围是有害的。

进一步阅读tl;dr 幻灯片(有一个视频与此相关,我目前找不到)。

于 2012-02-28T14:41:18.763 回答