Ich habe ein Problem mit der Kompilierung llvm. Das Problem ist, dass mein aktueller Compiler (clang + libC++) versucht, eine Vorlage zu instanziieren, bevor der Template-Parameter definiert wird. Hier ist der Code Beispiel:Instantiierung einer Liste mit einem unvollständigen Typ in einem 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;
...
};
Der Fehler vom Compiler ist dies:
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;
Soweit ich die Compiler sagen kann, versucht std::list<NodeEntry>
um zu instanziiert den Iterator zu bekommen. Dies schlägt fehl, da NodeEntry noch nicht definiert ist. Und natürlich verwendet EdgeEntry NodeEntry und umgekehrt.
Die offensichtliche Frage ist: Wie repariere ich es?
Die pädagogische Frage ist: Warum versucht der Compiler die Vorlage bei der Definition des Typs zu instanziieren? Sollte es nicht warten, bis wir etwas mit der Liste machen?
Danke.
Es scheint mit compl ++ 3.0 und libC++ (svn Version 154095) auf Linux zu kompilieren. – alexisdm
Interessant. Laut clang Webseite [wird die Funktion nicht unterstützt] (http://clang.llvm.org/compatibility.html#undep_incomplete) –