C++17 可选树,错误:无效使用不完整的类型

C++17 optional tree, error: invalid use of incomplete type

本文关键字:用不完 类型 无效 错误 C++17      更新时间:2023-10-16

当我编译一个包含可选类型的二叉树时:

#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;