C++17 可选树,错误:无效使用不完整的类型
C++17 optional tree, error: invalid use of incomplete type
当我编译一个包含可选类型的二叉树时:
#include <optional>
class BinaryTree
{
public:
BinaryTree();
int value;
std::optional<BinaryTree> left,right;
};
int main()
{
return 0;
}
通过
g++ -std=c++17 -Wfatal-errors main.cpp
我面临这个错误
In file included from /usr/include/c++/7/bits/move.h:54:0,
from /usr/include/c++/7/bits/stl_pair.h:59,
from /usr/include/c++/7/utility:70,
from /usr/include/c++/7/optional:36,
from main.cpp:1:
/usr/include/c++/7/type_traits: In instantiation of ‘struct std::is_trivially_copy_constructible<BinaryTree>’:
/usr/include/c++/7/optional:103:8: required from ‘class std::_Optional_base<BinaryTree>’
/usr/include/c++/7/optional:451:11: required from ‘class std::optional<BinaryTree>’
main.cpp:8:28: required from here
/usr/include/c++/7/type_traits:1409:12: error: invalid use of incomplete type ‘class BinaryTree’
struct is_trivially_copy_constructible
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated due to -Wfatal-errors.
我应该如何修复此错误?
Optional 包含该类型在参与时的完整实例。
在一个类型的实例中存储一个类型的两个实例是不可能的;它需要 2<=1。
请考虑使用指向类型的唯一指针,而不是可选指针。
如果您希望能够复制树,则必须编写值指针。 值指针是知道如何深度复制自身的指针。
@Yakk的答案是正确的。
正如 @Dietmar Kühl 指出的那样,std::unique_ptr
是您想要的可为空的非就地存储:
#include <memory>
class BinaryTree
{
public:
BinaryTree();
int value;
std::unique_ptr<BinaryTree> left,right;
};
int main()
{
return 0;
}
您希望使用 BinaryTree指针而不是实际的 BinaryTree 成员,因为该类型不完整。取代
std::optional<BinaryTree> left,right;
跟
std::optional<BinaryTree*> left,right;
相关文章:
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 类中的字符串不命名类型
- 不完整类型错误(E0409、E0070、E0515)
- CRTP 单一实例不完整类型或非文本类型
- 使用具有结构不完整类型错误的模板
- 哪些存储了不完整类型的 STL 数据结构可以用作类成员?
- Xalloc 不命名类型
- (结构名/类名)不命名类型C++
- 是否允许类类型的 std::function 成员变量(不完整类型)?
- MSVC 在不知道类型的情况下评估上下文(和错误)
- 为什么我得到变量"Node"不是类型名称错误
- Visual Studio Code "variable " u8 的 C/C++ 扩展名 " " 不是类型名称"
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 实例化具有不完整类型的类模板格式不正确(如果该类型是在之后定义的)
- C++ 外部类不命名类型
- 有没有办法用不变语法获得当前的类类型?
- 标准容器模板可以用不完整类型实例化吗?
- 什么时候不能用“类”代替“类型名”
- 用Clang编译c++11代码的不完整类型
- 为什么C++不能用 "super class" 类型的右值初始化 "derived class" 类型的变量?