c ++通过模板映射迭代

时间:2014-03-06 01:51:30

标签: c++ templates loops map

我在迭代我为模板Counter类构建的std :: map时遇到了麻烦。该类完全在名为“Counter.h”的文件中定义,因为我读到你应该在头文件中实现整个模板类,并且我在将功能拆分为.cpp时遇到了问题。 “Counter.h”的相关领域就像是......

//File: Counter.h

template class<T> class Counter {
  public:
    void foo() {
      class map<T,size_t>::iterator it;  //PROBLEM IS HERE.
      for (it = counts.begin(); it != counts.end; it++) {
        //Do map stuff.
      }   
    }

  private:
    map<T,size_t> counts;
}

但是,迭代器的声明会引发以下错误:

error: elaborated type refers to a typedef
       class map<T,size_t>::iterator mapIt;
                            ^

我无法绕过这个问题。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

class替换为typename

typename map<T,size_t>::iterator it;

它不是一个类,而是一个typedef,因此使用class将无法工作(无论如何,几乎总是不必在C ++中访问类似这样的类类型)。 typename是必要的,因为它是dependent name

除此之外,你有几个奇怪的目的,比如说template<class T> class Containerit != counts.end()

答案 1 :(得分:0)

使用示例的工作代码:

#include <iostream>
#include <map>

template<typename T>
struct counter_t
{
    void foo()
    {
        for (auto itr = counts.begin(); itr != counts.end(); ++itr)
        {
            std::cout << itr->first << ":" << itr->second << std::endl;
        }
    }

    std::map<T, size_t> counts;
};

int main()
{
    counter_t<int> a;
    a.counts.insert(std::make_pair(0, 42));
    a.counts.insert(std::make_pair(1, 62738));

    counter_t<char> b;
    b.counts.insert(std::make_pair('a', 23051));
    b.counts.insert(std::make_pair('b', 123789));

    a.foo();
    b.foo();
}

输出:

0:42
1:62738
a:23051
b:123789