带有映射的部分类模板专用化



我是一名新的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幻灯片(有一个视频,我现在找不到)。

最新更新