【发布时间】:2018-02-04 03:02:08
【问题描述】:
当我编译包含可选类型的二叉树时:
#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.
我应该如何解决这个错误?
【问题讨论】:
-
如果您不使用
std::optional,您将如何声明left和right? -
@DeiDei,我仍然会通过指针声明它们。
-
编译器需要确定
left的大小,这取决于BinaryTree的[完整]定义。本质上,您不能将类的对象嵌入到同一类的对象中。请改用std::unique_ptr<BinaryTree>。 -
你会使用指针,因为
BinaryTree在那个时候仍然是一个不完整的类型。错误是一样的。std::optional不是适合这项工作的工具。
标签: c++ templates std optional c++17