如何在模板化类中使用std::map迭代器?
How can I use a std::map iterator inside a templated class?
我在类模板中使用私有std::map变量时遇到了麻烦。谁能解释一下为什么下面的(简化的例子)不起作用,以及我应该做什么?
#include <iostream>
#include <map>
template <class T>
class Container
{
private:
typedef std::map<long, T> Map;
typedef Map::iterator Iterator; // <-- this is line 10
Map items;
public:
void insert(const long id, const T& item) { items[id] = item; }
void print()
{
for (Iterator iter = items.begin(); iter != items.end(); iter++)
{ std::cout << iter->second << std::endl; }
}
};
int main()
{
Container<int> container;
container.insert(300, 1);
container.insert(200, 2);
container.insert(100, 3);
container.print();
return 0;
}
产生的错误有点神秘:
t.cpp:10:错误:类型'std::map, std::allocator>>'不是从类型'Container'派生的
t.cp:10: error: ISO c++禁止声明没有类型
的'iterator't.p:10: error: expected ';' before "Iterator"
您需要限定依赖 typename:
typedef typename Map::iterator Iterator;
理由:编译器在解析模板时,无法判断它是类型还是值表达式。这是因为名称依赖于模板参数,而这些参数只有在实例化时才知道。
你必须帮助编译器。
旁注:
MSVC似乎对这条规则很宽松,因为它的模板实例化引擎以非标准的方式运行,并且直到实例化时间才完成名称查找
有时候,依赖成员模板也需要被限定:
template <typename aTuple> struct ContrivedSample { aTuple data; void foo() { auto v = data.template get<0>(); // template required } };
相关文章:
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 使用一个考虑到std::map中键值的滚动或换行的键
- 有没有办法对std::unordered_set、std::unrdered_map、std::set、std::map
- 将重物插入std::map
- 使用通用值初始化 std::map,不重复
- 仅包含可移动 std::map 的类的移动构造函数不起作用
- C++:当所有条目都保证是唯一时,替代 std::map
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- 如果 KEY 是 std::list 或 std::vector 而不是值,那么 std::map 的默认行为是什么?
- C++如何创建 std::map
- 从其他容器中移动构造"std::map"
- 将 std::map::emplace 与返回 shared_ptr 的函数一起使用是否正确?
- C++中 std::map 的运行时复杂度是多少?
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 使用重载 [] 运算符返回 std::map() 的可赋值
- std::map, std::unordered_map - 缩小初始值设定项列表中的转换范围
- C++ 使用枚举类对象分配 std::map 值
- 静态 std::map instatiation 在类的方法中调用构造函数吗?
- std::map:当元素不可默认构造时创建/替换元素
- Arduino编译器和STL:使用std::vector和std::map