【发布时间】:2016-05-12 20:51:20
【问题描述】:
我用 C++ 编写了一个程序,它可以用 clang++ 编译,但不能用 g++ 编译,我想了解原因。
关键部分是这样的:
class Table {
private:
...
std::unordered_map<std::string,Table> table_map;
...
};
我认为 std::unordered_map 会“在后台”使用指针,所以这是合法的。我不是在表内声明表,而是在创建一个容器,该容器具有指向表内表的指针。或者我是这么想的。 Clang++对此没有任何问题,程序运行良好。
但是,g++ 对此表示抱怨,说“note: forward declaration of 'class Table'”。这表明我应该明确地让 std::unordered_map 接受一个指针(std::unordered_map<std::string,Table*>,或者可能是某种智能指针)。这需要我做一些额外的工作(而且我正在处理我一年多前编写的代码,所以我并不急于必须弄清楚我做了什么才能进行必要的更改)。
这是 g++ 中的一个错误,还是 clang++ 做了一些不属于标准的聪明事情?有没有更好的方法来重写这段代码,以便在 clang++ 和 g++ 上编译?
我有另一个名为 Value 的类,并且 Table 中有一个值的 std::unordered_map,所以我是否可以通过创建一个超类 Element 来解决这个问题,Value 和 Table 都从该元素继承,然后让 Table 包含一个 @987654324 @?或者这样的地图会因为它是为元素声明的而无法存储值和表吗?
【问题讨论】:
-
计划
std::vector, std::list, andstd::forward_list` 支持不完整的类型,但还没有std::unordered_map。也许 Boost 的地图支持它。