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:
 `std::pair<_T1, _T2>::second' has incomplete type test.cpp:8: error: forward declaration of `struct Node'
        看样子是Node的定义还没有完成就让hash_map实例化它,所以无法成功。但是把hash_map换成map就可以编译通过了....即使是就用hash_map,上面的代码在VC2003.net环境上也可以编译通过。
        我估计原因是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;
};

相关文章

分类

留言:

关于文章

This page contains a single entry by DongHao published on 09 6, 2007 10:04 AM.

《入侵阿富汗》 was the previous entry in this blog.

认错了“巨人” is the next entry in this blog.

Find recent content on the main index or look in the 存档 to find all content.