2009-05-19 3 views
3

Wenn ich versuche, diesen Code zu kompilieren:Warum klagen g ++ bei der Verwendung von Template-Typen in graph_traits <>?

struct BasicVertexProperties 
{ 
    Vect3Df position; 
}; 

struct BasicEdgeProperties 
{ 
}; 

template < typename VERTEXPROPERTIES, typename EDGEPROPERTIES > 
class Graph 
{ 
    typedef adjacency_list< 
     setS, // disallow parallel edges 
     vecS, // vertex container 
     bidirectionalS, // directed graph 
     property<vertex_properties_t, VERTEXPROPERTIES>, 
     property<edge_properties_t, EDGEPROPERTIES> 
    > GraphContainer; 

    typedef graph_traits<GraphContainer>::vertex_descriptor Vertex; 
    typedef graph_traits<GraphContainer>::edge_descriptor Edge; 
}; 

g ++ mit dem folgenden Fehler in der klagt "typedef graph_traits <>" line:

error: type 'boost::graph_traits<boost::adjacency_list<boost::setS, boost::vecS, 
boost::bidirectionalS, boost::property<vertex_properties_t, VERTEXPROPERTIES, 
boost::no_property>, boost::property<edge_properties_t, EDGEPROPERTIES, 
boost::no_property>, boost::no_property, boost::listS> >' is not derived from type 
'Graph<VERTEXPROPERTIES, EDGEPROPERTIES>' 

Ich fand heraus, dass der Compiler nicht zu wissen scheint dass meine Vorlagenparameter Typen sind, aber "typename" vor ihnen in der Eigenschaftsdefinition zu setzen, hilft nicht.

Was ist los? Ich möchte einfach eine templated Graph-Klasse haben, um die Möglichkeit zu haben, beliebige Eigenschaften zu verwenden, die von den oben definierten grundlegenden Eigenschaftsstrukturen abgeleitet sind, so dass ich Methoden in diesem Graph haben kann, die mit den grundlegenden Eigenschaften arbeiten.

Antwort

7

Diese Linien:

typedef graph_traits<GraphContainer>::vertex_descriptor Vertex; 
    typedef graph_traits<GraphContainer>::edge_descriptor Edge; 

sein sollte:

typedef typename graph_traits<GraphContainer>::vertex_descriptor Vertex; 
    typedef typename graph_traits<GraphContainer>::edge_descriptor Edge; 

Das ist Grund dafür, dass der Compiler kann nicht eine Art, bis der Punkt nicht, dass vertex_descriptor sagen, wo Sie definieren, was GraphContainer (wie das ist man könnte möglicherweise in Bezug auf die anderen definiert werden).

In diesem Standard müssen Sie angeben, dass es sich um einen Typ und nicht um eine statische Elementvariable handelt.

+2

Das ist, weil Compiler kann nicht herausfinden, was ist :: Vertex_description und :: Edge_description, mit Typedef Typname Sie sagen ihm, dass graph_traits <> :: Vertex_description ist ein Typ – stefanB