0

如本网站所示,使用 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;
};

只需将顶点更改为容器向量。它在 C++ 11 的 Clang 中无效,但在其他编译器和 C++98 中都可以。


再次更新:

似乎矢量工作正常..但列表失败

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'
4

1 回答 1

3

如果它不编译,则意味着vertex尝试以Node需要完全定义它的方式使用。大多数情况下,这意味着(对于通用代码)使用T参数的大小:

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

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

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

于 2013-04-02T07:55:04.977 回答