gpt4 book ai didi

c++ - STL 容器在该类的声明中持有类

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:41 24 4
gpt4 key购买 nike

我用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com