C++ C++;结构错误的正向声明

C++ C++;结构错误的正向声明,c++,struct,forward-declaration,C++,Struct,Forward Declaration,我正试图用C++实现这一点: struct sagrup { int imps; int clicks; int uclicks; int conversions; int * variable; unordered_map<int, struct sagrup> siguiente; }; unordered_map<int, struct sagrup> agrupacion; struct sagrup { int

我正试图用C++实现这一点:

struct sagrup
{
    int imps;
    int clicks;
    int uclicks;
    int conversions;
    int * variable;
    unordered_map<int, struct sagrup> siguiente;
};

unordered_map<int, struct sagrup> agrupacion;
struct sagrup
{
int imps;
int点击;
内舔;
整数转换;
int*变量;
无序地图标志;
};
无序地图破坏;
我得到了一个错误:“struct sagrup”的前向声明

我想拥有这个结构,并将其他结构添加到有序映射中,这样它就会像一棵树一样


感谢所有能帮忙的人

您有几个问题:

首先,您不需要到处使用
struct
。其次,您试图将不完整的类型与需要完整类型定义的模板一起使用(否则它不知道如何构造它)。该映射应该声明为指针,而不是sagrup的另一个实例

生成的代码如下所示:

struct sagrup
{
int imps;
int点击;
内舔;
整数转换;
int*变量;
无序地图标志;
};
无序地图破坏;

您有几个问题:

首先,您不需要到处使用
struct
。其次,您试图将不完整的类型与需要完整类型定义的模板一起使用(否则它不知道如何构造它)。该映射应该声明为指针,而不是sagrup的另一个实例

生成的代码如下所示:

struct sagrup
{
int imps;
int点击;
内舔;
整数转换;
int*变量;
无序地图标志;
};
无序地图破坏;

在完全定义类型之前,编译器对该类型一无所知;i、 e.成员是什么、成员的大小及其完整性

转发声明仅用于指向此类结构的引用和指针

或者,您可以使用:

无序地图符号


结构中

类型尚未完全定义之前,编译器对该类型一无所知;i、 e.成员是什么、成员的大小及其完整性

转发声明仅用于指向此类结构的引用和指针

或者,您可以使用:

无序地图符号


在您的
struct

中不一定有一个永无止境的构造链--
unordered\u map
中不一定有一个
V
类型的成员。@adamrosenfied,verbiage是固定的。“第二,您的siguiente成员有一个永无止境的构造链”这句话不一定是真的,取决于无序映射的实现方式<代码>std::shared_ptr
可以很好地实例化,即使
sagrup
是一个不完整的类型。
struct X{shared_ptr p;}中没有无限的构造链
因为
shared\u ptr
没有
X
类型的成员,它有
X*
类型的成员,所以
shared\u ptr
的构造不需要构造
X
@AdamRosenfield抱歉,我第一次编辑时漏掉了一句话。固定的但是,
shared_ptr
的示例不适用于OP当前的问题。谢谢!,使用sagrup*修复了这个问题。=)谢谢这里不一定有一个永无止境的构造链--
unordered\u map
中不一定有
V
类型的成员。@AdamRosenfield这个词是固定的。“第二,你和你的siguiente成员有一个永无止境的构造链”这句话不一定是真的,取决于无序映射的实现方式<代码>std::shared_ptr
可以很好地实例化,即使
sagrup
是一个不完整的类型。
struct X{shared_ptr p;}中没有无限的构造链
因为
shared\u ptr
没有
X
类型的成员,它有
X*
类型的成员,所以
shared\u ptr
的构造不需要构造
X
@AdamRosenfield抱歉,我第一次编辑时漏掉了一句话。固定的但是,
shared_ptr
的示例不适用于OP当前的问题。谢谢!,使用sagrup*修复了这个问题。=)ThanksForward声明也可以用于模板参数,前提是类允许。例如,
std::shared_ptr
可以在不完整的类型上实例化,因为标准明确允许这样做。但是
std::unordered_-map
不能是。@AdamRosenfield
shared_-ptr
unique_-ptr
可以使用不完整的类型,因为它们并不真正关心类型,而是一个指向类型的指针。@ZacHowland:Right,这就是为什么模板是否可以在不完整的类型上实例化取决于类实现的细节
shared_ptr
可以,
unordered_map
不能。只有在类允许的情况下,转发声明也可以用于模板参数。例如,
std::shared_ptr
可以在不完整的类型上实例化,因为标准明确允许这样做。但是
std::unordered_-map
不能是。@AdamRosenfield
shared_-ptr
unique_-ptr
可以使用不完整的类型,因为它们并不真正关心类型,而是一个指向类型的指针。@ZacHowland:Right,这就是为什么模板是否可以在不完整的类型上实例化取决于类实现的细节<代码>共享\u ptr可以,而
无序\u map
不能。
struct sagrup
{
    int imps;
    int clicks;
    int uclicks;
    int conversions;
    int * variable;
    unordered_map<int, sagrup*> siguiente;
};

unordered_map<int, sagrup> agrupacion;