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

时间:2013-04-02 07:41:29

标签: c++ c++11 clang

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

只需将顶点更改为容器向量即可。它在Clang with C ++ 11中无效,但对其他编译器和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'

1 个答案:

答案 0 :(得分:3)

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

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

另一个(可能的)问题是依赖T的方法来进行某些模板实例化;然而这种情况更为罕见。

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