我在迭代我为模板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;
^
我无法绕过这个问题。有什么想法吗?
答案 0 :(得分:1)
将class
替换为typename
:
typename map<T,size_t>::iterator it;
它不是一个类,而是一个typedef,因此使用class
将无法工作(无论如何,几乎总是不必在C ++中访问类似这样的类类型)。 typename
是必要的,因为它是dependent name。
除此之外,你有几个奇怪的目的,比如说template<class T> class Container
和it != 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