gpt4 book ai didi

c++ - Clang 编译 c++11 代码的不完整类型

转载 作者:行者123 更新时间:2023-11-28 00:47:26 27 4
gpt4 key购买 nike

As this website shows ,使用 C++11 的 Clang 将不支持以下代码:

class Node {
vertex<Node> children;
};

会出现错误:

field has incomplete type 'Node'

但 C++98 和其他编译器(例如 C++11 中的 gcc)支持此类代码。

我知道我可以用

vertex<Node*>

相反,但目前我与 C++98 中的旧代码存在一些不兼容问题。

我的问题是,(1) 我可以在 C++11 中使用 Clang 编译此类代码吗? (2) 我认为树结构不可避免地需要像上面这样定义,没有这种特性的支持,我怎么能实现这样的树结构?


更新:

很抱歉忘记给出顶点的定义,下面的代码呢:

class Node {
vector<Node> children;
};

只需将顶点更改为容器 vector 即可。它在 C++11 的 Clang 中无效,但在其他编译器和 C++98 中没问题。


再次更新:

看起来 vector 工作正常..但列表失败

class Node {
std::list<Node> children;
};

再次更新:

以下是我的代码:

#include <list>

using namespace std;

class Node {
list<Node> nodes;
};

int main(int argc, char const *argv[])
{
return 0;
}

或更简单:

#include <list>

class Node {
std::list<Node> nodes;
};

int main() {}

我正在使用 Clang 4.0 并使用以下命令进行编译:

clang++ -std=c++11 -stdlib=libc++ test.cpp

错误是

/usr/bin/../lib/c++/v1/list:212:9: error: field has incomplete type 'Node'

最佳答案

如果编译不通过,说明vertex尝试使用 Node以一种要求它被完全定义的方式。大多数时候,这意味着(对于通用代码)使用 T 的大小参数:

  • 明确地 ( sizeof(T) )
  • 或隐式template <typename T> struct vertex { T data[3]; };正在使用 T 的大小计算类型的布局

另一个(可能的)问题是依赖 T 的方法对于一些模板实例化;然而,这种情况要少得多。

您可以通过更改 vertex 的定义来避免此要求.虽然不知道它是什么,但我们无法获得更具体的...

关于c++ - Clang 编译 c++11 代码的不完整类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15758690/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com