【问题标题】:Partial class template specialization with maps带有地图的部分类模板专业化
【发布时间】:2012-03-18 00:50:59
【问题描述】:

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

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

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

我发现在 C++ 上做类似事情的唯一方法是编写 2 个 getter,iteratorBegin()iteratorEnd(),它们返回一个对应于第一个和最后一个位置的迭代器,递增 iteratorBegin() 返回的迭代器并比较它使用iteratorEnd(),允许我遍历容器直到到达最终位置

但是,我只想使用 ONE 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 &lt;map&gt;

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

拜托,我需要一些帮助。

感谢您的关注!

【问题讨论】:

  • 在包含映射下使用 std::map。或者在 custIterator ... 中限定地图可能会成功。

标签: c++ templates map iterator partial-specialization


【解决方案1】:

所有的标准容器都在命名空间std中,你应该这样限定它

std::map<T,D>

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

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

Further readingtl;dr slides(我暂时找不到相关视频)。

【讨论】:

  • +1 “不要尝试将 Java 惯用语移植到 C++,因为每种语言都有自己的惯用语” - 通常使用惯用语是有充分理由的。
  • 多么可耻的错误,非常感谢,它起作用了 现在,我似乎不得不再次阅读我的模板专业化手册,因为我在编译代码时遇到了其他困难。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多