关于STL map & hash_map在头文件中定义的问题

YoungXYYX 2014-07-06 05:33:14
我有一些配置信息,需要在头文件中用到hash_map定义的,测试代码如下:

// .h
#ifndef __STL_MAPTEST_H__
#define __STL_MAPTEST_H__

#include <hash_map>

std::hash_map<std::string, const char*> HashMapTest;
HashMapTest["key1"] = "Value1";

#endif // __STL_MAPTEST_H__

把这个代码拿去编译,得到的错误如下:

1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C2057: 应输入常量表达式
1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C2466: 不能分配常量大小为 0 的数组
1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int
1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C2040: “HashMapTest”:“int []”与“stdext::hash_map<_Kty,_Ty>”的间接寻址级别不同
1> with
1> [
1> _Kty=std::string,
1> _Ty=char *
1> ]
1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C2440: “初始化”: 无法从“const char [20]”转换为“int []”
1> 没有使该转换得以执行的上下文
1>
1>生成失败。

测试环境为:windows 7 + vs2010

求问,应该怎么使用?
...全文
596 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
Lua 写太多了,C++ 写太少。
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
引用 10 楼 akirya 的回复:
[quote=引用 6 楼 qqYang123456789 的回复:] [quote=引用 5 楼 taodm 的回复:] 楼主,你在哪本教材学的在函数外面给变量赋值?
全局变量,好吗?[/quote] 就算全局变量也只能初始化,不能赋值。 要么是书太烂,要么是你看书不仔细[/quote] 基础不扎实犯的错。
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
引用 8 楼 chunxi_cao 的回复:
LZ,还是再去看看书。。。全局变量只能在定义时候才能在函数外赋值,都定义完了还能在函数外赋值?
多谢多谢 ! 直接说明才是最解渴的。
  • 打赏
  • 举报
回复
引用 6 楼 qqYang123456789 的回复:
[quote=引用 5 楼 taodm 的回复:] 楼主,你在哪本教材学的在函数外面给变量赋值?
全局变量,好吗?[/quote] 就算全局变量也只能初始化,不能赋值。 要么是书太烂,要么是你看书不仔细
  • 打赏
  • 举报
回复
推荐你一种方法,也是可以自动初始化 class InitHashmap { public: InitHashmap(std::hash_map<string, const char*>& str_map) { str_map["key1"] = "Value1"; } }; std::hash_map<string, const char*> HashMapTest; InitHashmap init(HashMapTest);
  • 打赏
  • 举报
回复
LZ,还是再去看看书。。。全局变量只能在定义时候才能在函数外赋值,都定义完了还能在函数外赋值?
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
引用 5 楼 taodm 的回复:
楼主,你在哪本教材学的在函数外面给变量赋值?
哪本教材里说了函数外面不能给变量赋值?我要去看看。
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
引用 5 楼 taodm 的回复:
楼主,你在哪本教材学的在函数外面给变量赋值?
全局变量,好吗?
taodm 2014-07-06
  • 打赏
  • 举报
回复
楼主,你在哪本教材学的在函数外面给变量赋值?
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
引用 3 楼 mujiok2003 的回复:
[quote=引用 2 楼 qqYang123456789 的回复:] [quote=引用 1 楼 mujiok2003 的回复:] unordered_map hash_map不是标准容器,不是在所有编译器上都有
我确定我的是有的。。 如果没有,报的错误会是未定义的标识符。[/quote] http://msdn.microsoft.com/zh-cn/library/8zz3703d%28v=vs.90%29.aspx,这里有实例[/quote] 我尝试用了insert, std::hash_map<std::string, const char*> HashMapTest; HashMapTest.insert(pair<std::string, char*>("vampire", "WeaponButtonVampire")); 然后报错信息变了: 1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C2143: 语法错误 : 缺少“;”(在“.”的前面) 1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int 1>e:\coding\cpp\cpptest\cpptest\stl_maptest.h(21): error C2371: “HashMapTest”: 重定义;不同的基类型 1> e:\coding\cpp\cpptest\cpptest\stl_maptest.h(19) : 参见“HashMapTest”的声明 1> 1>生成失败。
mujiok2003 2014-07-06
  • 打赏
  • 举报
回复
引用 2 楼 qqYang123456789 的回复:
[quote=引用 1 楼 mujiok2003 的回复:] unordered_map hash_map不是标准容器,不是在所有编译器上都有
我确定我的是有的。。 如果没有,报的错误会是未定义的标识符。[/quote] http://msdn.microsoft.com/zh-cn/library/8zz3703d%28v=vs.90%29.aspx,这里有实例
YoungXYYX 2014-07-06
  • 打赏
  • 举报
回复
引用 1 楼 mujiok2003 的回复:
unordered_map hash_map不是标准容器,不是在所有编译器上都有
我确定我的是有的。。 如果没有,报的错误会是未定义的标识符。
mujiok2003 2014-07-06
  • 打赏
  • 举报
回复
unordered_map hash_map不是标准容器,不是在所有编译器上都有
》灰《《常好的STL教程Effective STL 目录 容器 条款1: 仔细选择你要的容器 条款2: 小心对“容器无关代码”的幻想 条款3: 使容器里对象的拷贝操作轻量而正确 条款4: 用empty来代替检查size是否为0 条款5: 尽量使用范围成员函数代替他们的单元素兄弟 条款6: 警惕C++的及其令人恼怒的分析 条款7: 当使用new得指针的容器时,切记在容器销毁前delete那些指针 条款8: 千万不要把auto_ptr放入容器 条款9: 小心选择删除选项 条款10: 当心allocator的协定和约束 条款11: 了解自定义allocator的正统使用法 条款12: 对STL容器的线程安全性的期待现实一些 vector和string 条款13: 尽量使用vector和string来代替动态申请的数组 条款14: 用reserve来避免不必要的内存重新分配 条款15: 当心string的实现的变化 条款16: 如何将vector和string的数据传给传统的API 条款17: 用“交换技巧”来修正过度的容量 条款18: 避免使用vector 关联容器 条款19: 了解相等和等价的区别 条款20: 为包含指针的关联容器指定比较类型 条款21: 永远让比较函数对相等的值返回false 条款22: 避免对set和multiset的键值进行修改 条款23: 考虑用排序的vector代替关联容器 条款24: 当效率很关键时尽量用map::insert代替map::operator 条款25: 让自己熟悉非标准的hash容器 迭代器 条款26: 尽量使用iterator代替const_iterator,reverse_iterator和const_reverse_iterator 条款27: 使用distance和advance把const_iterators转化成iterators 条款28: 了解如何通过reverse_iterator的base得到iterator 条款29: 需要一字符一字符输入时请用istreambuf_iterator 算法 条款30: 确保目的范围足够大 条款31: 了解你的排序选项 条款32: 如果你真的想删除东西的话在remove-like的算法后紧接上erase 条款33: 当心在包含指针的容器使用remove-like的算法 条款34: 注意哪些算法需要排序过的范围 条款35: 通过mismatch或lexicographical_compare实现简单的忽略大小写字符串比较 条款36: 用not1和remove_copy_if来表现copy_if 条款37: 用accumulate或for_each来统计序列 仿函数,仿函数类,函数等等 条款38: 把仿函数类设计成值传递的 条款39: 用纯函数做predicate 条款40: 增强仿函数类的适应性 条款41: 明确ptr_fun, mem_fun和mem_fun_ref的区别 条款42: 保证less是operator<的意思 用STL编程 条款43: 尽量用算法调用代替手写循环 条款44: 尽量用成员函数代替同名的算法 条款45: 注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别 条款46: 考虑用函数对象代替函数作为算法的参数 条款47: 避免产生只写代码 条款48: 总是#include适当的头文件 条款49: 学会破解STL相关的编译器出错信息 条款50: 让自己熟悉STL相关的网站

65,189

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧