Почему g ++ жалуется при использовании шаблонных typedefs в graph_traits <>? - PullRequest
3 голосов
/ 19 мая 2009

Когда я пытаюсь скомпилировать этот код:

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 ++ жалуется на следующую ошибку в строке "typedef graph_traits <>":

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>'

Я обнаружил, что компилятор, похоже, не знает, что параметры моего шаблона являются типами, но указание "typename" перед ними в определении свойства не помогает.

Что не так? Я просто хочу иметь шаблонный класс Graph, чтобы иметь возможность использовать любые свойства, которые мне нравятся, производные от базовых структур свойств, определенных выше, поэтому у меня могут быть методы в этом Graph, которые работают с основными свойствами.

1 Ответ

7 голосов
/ 19 мая 2009

Эти строки:

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

должно быть:

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

Причина в том, что компилятор не может сказать, что vertex_descriptor является типом, до точки, где вы определяете, что такое GraphContainer (так как один может быть определен в терминах другого).

Этот стандарт требует, чтобы вы указали, что это тип, а не статическая переменная-член.

...