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

标签 c++ pointers c++11 stl

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

相关文章:

c++ - 正确地将已知数量的整数输入读入 C++ 中的 vector

c++ - C 和 C++ 标准是否暗示地址空间中的特殊值必须仅存在以表示空指针的值?

c++ - 为什么在 __assume 中使用函数调用时 MSVC 不报错?

c++ - 如何将 C++ 编译器错误 "cannot convert ' Type' 修复为 'const Type*' "?

c++ - ifstream的move构造函数是否被隐式删除?

c++ - 依赖模板可以使用 Visual Studio 编译,但使用 clang/gcc 失败

c++ - 为什么 wxLocale 甚至不尝试加载语言?

c - malloc 内部函数导致 SIGSEGV

c++ - 双 * android ndk 崩溃

javascript - SpiderMonkey 是线程安全的是什么意思?