编译llvm时遇到问题。问题是我的当前编译器(clang + libC++)试图在template参数被定义之前实例化一个模板。下面是代码示例:在typedef中使用不完整类型的列表实例化
// ----- TYPEDEFS -----
class NodeEntry;
class EdgeEntry;
typedef std::list<NodeEntry> NodeList;
typedef std::list<EdgeEntry> EdgeList;
typedef NodeList::iterator NodeItr; // line 39
typedef NodeList::const_iterator ConstNodeItr;
typedef EdgeList::iterator EdgeItr;
typedef EdgeList::const_iterator ConstEdgeItr;
typedef std::list<EdgeItr> AdjEdgeList;
typedef AdjEdgeList::iterator AdjEdgeItr;
class NodeEntry {
private:
AdjEdgeList adjEdges;
...
};
class EdgeEntry {
private:
AdjEdgeItr node1AEItr, node2AEItr;
...
};
从编译器中的错误是这样的:
error: field has incomplete type 'PBQP::Graph::NodeEntry'
/Developer/Extras/llvm/include/llvm/CodeGen/PBQP/Graph.h:39:13: note: in instantiation of template class
'std::__1::list<PBQP::Graph::NodeEntry, std::__1::allocator<PBQP::Graph::NodeEntry> >' requested here
typedef NodeList::iterator NodeItr;
^
/Developer/Extras/llvm/include/llvm/CodeGen/PBQP/Graph.h:31:11: note: forward declaration of 'PBQP::Graph::NodeEntry'
class NodeEntry;
至于我可以告诉编译器试图以获得迭代器实例std::list<NodeEntry>
。由于NodeEntry尚未定义,因此这会失败。当然EdgeEntry使用NodeEntry,反之亦然。
显而易见的问题是:我该如何解决?
教育问题是:为什么编译器在定义类型时尝试实例化模板?它是否应该等到我们对清单做些什么?
谢谢。
它似乎可以在linux上用clang ++ 3.0和libC++(svn 154095)编译。 – alexisdm 2012-04-08 20:09:38
有趣。根据铿锵网站[该功能不支持](http://clang.llvm.org/compatibility.html#undep_incomplete) – 2012-04-09 10:17:14