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)
拜托,我需要一些帮助.
感谢您的关注!
所有标准容器都在命名空间std中,因此您应该对其进行限定
std::map<T,D>
Run Code Online (Sandbox Code Playgroud)
一般来说,我建议不要试图将Java习语带到C++,因为每种语言都有自己的习语,混合它们会让其他程序员感到困惑(正如我认为这 #define BEGIN {不是最好的想法).
您尝试做的事情被称为范围,有些人认为它是比C++迭代器更好的解决方案,但在它进入语言之前,我认为每个开发人员发明自己的范围都是有害的.
进一步阅读或tl;博士幻灯片(有一个视频,这是我目前无法找到的).
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |