C++ “错误”;C2027未定义类型的使用;当使用std::deque而不是vector时 #包括 #包括 //#包括 #包括 命名空间xmltree{ 类XMLNode{ //其他领域、方法。。。 性病:德克!; ...

C++ “错误”;C2027未定义类型的使用;当使用std::deque而不是vector时 #包括 #包括 //#包括 #包括 命名空间xmltree{ 类XMLNode{ //其他领域、方法。。。 性病:德克!; ...,c++,C++,如果将\u childs定义为std::vector,则代码将编译,但使用std::deque我得到错误: C2027未定义类型的使用 std::deque在这里有什么问题以及如何修复它?自C++17以来,std::vector(以std::allocator作为分配器)可以用不完整的类型实例化: 当实例化vector时,如果分配器满足以下条件,则可以使用不完整类型T。T应在引用所产生的vector专门化的任何成员之前完成 并且std::allocator确实满足分配器完整性要求 默认分配器的所

如果将
\u childs
定义为
std::vector
,则代码将编译,但使用
std::deque
我得到错误:

C2027未定义类型的使用


std::deque在这里有什么问题以及如何修复它?

自C++17以来,
std::vector
(以
std::allocator
作为分配器)可以用不完整的类型实例化:

当实例化
vector
时,如果分配器满足以下条件,则可以使用不完整类型
T
T
应在引用所产生的
vector
专门化的任何成员之前完成

并且
std::allocator
确实满足分配器完整性要求

默认分配器的所有专门化都满足分配器完整性要求()


另一方面,
std::deque
没有这样的保证;它只允许
std::forward_list
std::list
std::vector
自C++17以来,
std::vector
(以
std::分配器
作为分配器)可以用不完整的类型实例化:

当实例化
vector
时,如果分配器满足以下条件,则可以使用不完整类型
T
T
应在引用所产生的
vector
专门化的任何成员之前完成

并且
std::allocator
确实满足分配器完整性要求

默认分配器的所有专门化都满足分配器完整性要求()


另一方面,
std::deque
没有这样的保证;它只允许
std::forward\u list
std::list
std::vector

为什么
std::deque
失败

std::deque
需要一个完整的元素类型。在声明时,
XMLNode
仍然不完整。通常的解决方法是使用某种(智能)指针。指向不完整类型的指针是完整的。(所有指针大小相同,无论它们指向什么。)

因此,一个选项是
std::deque
,然而,根据您的场景,您可能需要处理其他内容


为什么
std::vector
编译

std::vector
允许在实例化过程中使用不完整的元素类型,因为C++17在特殊情况下是不完整的。特别是,当不完整类型的分配器完成时,它允许使用不完整的元素类型。在您的示例中似乎就是这样。请注意,只有当元素类型为i时,才能使用
std::vector
完成,例如添加、调整大小、访问元素等


请参阅为什么
std::deque
失败

std::deque
需要一个完整的元素类型。在声明时,
XMLNode
仍然不完整。通常的解决方法是使用某种(智能)指针。指向不完整类型的指针是完整的。(所有指针大小相同,无论它们指向什么。)

因此,一个选项是
std::deque
,然而,根据您的场景,您可能需要处理其他内容


为什么
std::vector
编译

std::vector
允许在实例化过程中使用不完整的元素类型,因为C++17在特殊情况下是不完整的。特别是,当不完整类型的分配器完成时,它允许使用不完整的元素类型。在您的示例中似乎就是这样。请注意,只有当元素类型为i时,才能使用
std::vector
完成,例如添加、调整大小、访问元素等


请参见

显然不应该发生这种情况。要了解更多信息,我将尝试处理包含文件的顺序。另一件事是尝试删除名称空间,看看这是否有帮助(不是作为永久解决方案,只是为了更深入地理解问题)。另一种尝试是使用带别名的
std::deque
使用
,看看这是否有助于纠正错误。在声明时,类型
XMLNode
不完整。但是
std::vector
也不应该工作(出于完全相同的原因)。请提供另一个编译的
std::vector
示例。最好使两个示例都完整。@selalerer不,这显然应该发生。这里唯一令人困惑的是OPs声称代码与
std::vector
一起工作。
std::vector
std::deque
都需要知道c的大小包含类型,并且在OP声明它们时,大小未知。失败:,成功:您不能。类在完成之后就完成了。您不能在该点使用它。显然不应该这样做。要了解更多信息,我将尝试按照包含文件的顺序进行操作。另一件事是尝试在d看看这是否有帮助(不是一个永久性的解决方案,只是为了更好地理解问题)。另一个尝试是使用带别名的
作为
std::deque
,看看这是否有帮助错误是否正确。在声明时,类型
XMLNode
不完整。但是
std::vector
也不应该起作用(出于完全相同的原因)。请提供另一个编译的
std::vector
示例。最好使两个示例都完整。@selalerer不,这显然应该发生。这里唯一令人困惑的是OPs声称代码与
std::vector
一起工作。
std::vector
std::deque
都需要知道c的大小包含
#include <string>
#include <deque>
//#include <vector>
#include <map>

namespace xmltree {
    class XMLNode {
        // other fields, methods...
        std::deque<XMLNode> _childs;
...