部分类模板专业化与地图

Ima*_*ego 1 c++ templates iterator map partial-specialization

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

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

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

我发现在C++上做类似事情的唯一方法就是编写2个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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

拜托,我需要一些帮助.

感谢您的关注!

Mot*_*tti 5

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

std::map<T,D>
Run Code Online (Sandbox Code Playgroud)

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

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

进一步阅读tl;博士幻灯片(有一个视频,这是我目前无法找到的).