Typedef循环依赖

Baz*_*Baz 8 c++ circular-dependency forward-declaration

如何解决以下循环依赖?

typedef boost::variant<int, bool, double, std::string, Structure> Value;
typedef std::list<std::pair<std::string, ValueContainer>> Structure;
typedef std::vector<Value> ValueContainer;
Run Code Online (Sandbox Code Playgroud)

我试图用更多C++形式表示来自C api数据库库的对象.此数据库允许存储值或值数组,以及具有Structures的表示,如下所示:

typedef struct ApiStructureMember 
{
    char* name;
    struct ApiValueContainer value;
    struct ApiStructureMember_T* next;
} ApiStructureMember_T;
Run Code Online (Sandbox Code Playgroud)

最后,union用于表示值,如下所示:

typedef struct ApiValue 
{
    union 
    {
        int i;
        const char*   s;
        ...
        struct ApiStructureMember_T* firstStructureMember;
    } value;
} ApiValue_T; 
Run Code Online (Sandbox Code Playgroud)

Tem*_*Rex 5

您不能让彼此相互包含的类型.想一想:编译器会进入生成数据的无限循环.

有两种通用模式:第一种是通过指向彼此的数据类型

struct OddNode; // forward declaration

struct EvenNode 
{
    OddNode* prev;
    OddNode* next;
};

struct OddNode
{
    EvenNode* prev;
    EvenNode* next;
};
Run Code Online (Sandbox Code Playgroud)

如果省略指针,并按值包含实现Even和Odd节点,则编译器永远无法解析定义.

一般情况下:只需绘制一张图片,说明如何布局数据,方框表示数据和连接各个部分的线条.然后用一个类替换每个框,每行用指向相应类的指针.如果你在某处有循环依赖,只需在代码顶部转发声明类.

第二个循环依赖是通过奇怪的重复模板参数(CRTP)

template<typename T> 
struct Y 
{};

struct X
: 
    public Y<X> 
{};
Run Code Online (Sandbox Code Playgroud)

您的示例将使用Structureas Xstd::list< ..., Structure>as 的CRTP Y<X>.