llvmのコンパイルに問題があります。問題は、現在のコンパイラ(clang + libc ++)が、テンプレートパラメータが定義される前にテンプレートをインスタンス化しようとすることです。コード例は次のとおりです。
// ----- 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を使用しており、その逆も同様です。
明らかな質問は次のとおりです。どうすれば修正できますか?
教育的な質問は次のとおりです。型を定義するときにコンパイラがテンプレートをインスタンス化しようとするのはなぜですか。リストで何かをするまで待つべきではありませんか?
ありがとう。