#include <string>
#include <deque>
//#include <vector>
#include <map>
namespace xmltree {
class XMLNode {
// other fields, methods...
std::deque<XMLNode> _childs;
...
如果要将_childs
定义为std::vector<XMLNode>
,代码将编译,但是使用std::deque
,我会得到错误:
C2027未定义类型的使用
std::deque这里有什么问题,以及如何修复?
发布于 2019-12-15 03:27:05
为什么std::deque
失败
std::deque
需要一个完整的元素类型。在声明的时候,XMLNode
仍然是不完整的。通常的方法是使用某种(智能)指针。指向不完整类型的指针是完整的。(所有指针都有相同的大小,无论它们指向什么。)
因此,一种选择是std::deque<std::unique_ptr<XMLNode>>
,但是取决于您的场景,您可能希望使用其他的东西。
请参阅std::deque
std::vector
编译的原因
std::vector
允许在实例化期间使用不完整的元素类型,因为C++17是在特殊情况下使用的。具体来说,它允许在不完全类型的分配器完成时使用。在你的例子中似乎就是这样。请注意,只有在元素类型完成时才能使用std::vector
,例如添加、调整大小、访问元素等。
请参阅std::vector
发布于 2019-12-15 03:25:56
由于C++17,可以用不完全类型实例化std::vector
(以std::allocator
作为分配器)。[vector.overview]/4
如果分配程序满足
T
,则在实例化vector
时可以使用不完全类型分配器完整性要求。T
必须在引用vector
的结果专门化的任何成员之前完成。
std::allocator
确实满足了分配程序的完整性要求。[default.allocator]/1
默认分配程序的所有专门化都满足分配程序完整性要求([allocator.requirements.completeness])。
另一方面,std::deque
没有这样的保证;它只允许std::forward_list
、std::list
和std::vector
使用。
https://stackoverflow.com/questions/59343190
复制