hash_map的奇怪问题
一段简单的代码:
我估计原因是gcc里的hash_map的实现依赖于pair的大小,所以如果_T2(即Node)类型不完整,pair就无法实例化,hash_map的大小也就无法确定。map其实也有这个问题,如果在编译时加上-D_GLIBCXX_CONCEPT_CHECKS参数,就可以看到编译错误。但为什么默认关掉这个参数?八成这是gcc做的一个“跳线逻辑”,免得开发者老抱怨 :)
至于VC2003能顺利编译,这是因为微软的一贯作风:宁可将就用户,不可将就标准。这和gcc是两个风格。
要解决hash_map的这个问题有两个办法,一个是使用继承:
#include <map> #include <ext/hash_map> using namespace std; using namespace __gnu_cxx; struct Node { size_t a; hash_map<int,Node> subNode; }; int main(void) {}用g++编译时却出错:
.... test.cpp:10: instantiated from here /usr/lib/gcc/i386-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_pair.h:74: error:看样子是Node的定义还没有完成就让hash_map实例化它,所以无法成功。但是把hash_map换成map就可以编译通过了....即使是就用hash_map,上面的代码在VC2003.net环境上也可以编译通过。
`std::pair<_T1, _T2>::second' has incomplete type test.cpp:8: error: forward declaration of `struct Node'
我估计原因是gcc里的hash_map的实现依赖于pair的大小,所以如果_T2(即Node)类型不完整,pair就无法实例化,hash_map的大小也就无法确定。map其实也有这个问题,如果在编译时加上-D_GLIBCXX_CONCEPT_CHECKS参数,就可以看到编译错误。但为什么默认关掉这个参数?八成这是gcc做的一个“跳线逻辑”,免得开发者老抱怨 :)
至于VC2003能顺利编译,这是因为微软的一贯作风:宁可将就用户,不可将就标准。这和gcc是两个风格。
要解决hash_map的这个问题有两个办法,一个是使用继承:
struct BaseNode { }; struct Node: public BaseNode { size_t a; hash_map<int,BaseNode> subNode; };另一个是使用指针:
struct Node { size_t a; hash_map<int,Node> *subNode; };
相关文章
- [c++] 小心析构函数 - 07 22, 2010
- [compiler] gcc下的errno冲突 - 01 21, 2010
- “我能见一下为我做这份晚餐的厨师吗?” - 01 08, 2010
留言: