首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用std::deque代替向量时出错"C2027使用未定义类型“

使用std::deque代替向量时出错"C2027使用未定义类型“
EN

Stack Overflow用户
提问于 2019-12-15 10:56:55
回答 2查看 909关注 0票数 1
代码语言:javascript
运行
复制
#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这里有什么问题,以及如何修复?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-15 11: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

票数 1
EN

Stack Overflow用户

发布于 2019-12-15 11: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_liststd::liststd::vector使用。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59343190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档