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'
答案 0 :(得分:3)
如果它不编译,则意味着vertex
尝试以要求完全定义它的方式使用Node
。大多数情况下,这意味着(对于通用代码)使用T
参数的大小:
sizeof(T)
)template <typename T> struct vertex { T data[3]; };
使用T
的大小来计算类型的布局另一个(可能的)问题是依赖T
的方法来进行某些模板实例化;然而这种情况更为罕见。
您可以通过更改vertex
的定义来避免此要求。不知道它是什么,我们将无法更具体......