我用 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 的 Values,那么我是否可以通过创建一个 Value 和 Table 都继承自的父类(super class) Element,然后让 Table 包含一个 std::unordered_map<std::string,Element>
来解决这个问题?还是这样的 map 无法存储值和表,因为它是为元素声明的?
最佳答案
该错误是由于 std::unordered_map 必须重新散列表然后复制元素引起的。因此,容器中存储的值必须是完整类型。
您可以通过将值包装到智能指针中来克服它:
#include <iostream>
#include <string>
#include <unordered_map>
#include <memory> // shared_ptr
class Table {
private:
std::unordered_map<std::string, std::shared_ptr<Table> > t;
};
int main() {
Table t;
return 0;
}
Compiles .
关于c++ - STL 容器在该类的声明中持有类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37197181/