編譯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