Por que g ++ reclamar ao usar typedefs templated em graph_traits <>?

votos
3

Quando tento compilar este código:

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 ++ reclama com o seguinte erro no graph_traits typedef <> linha:

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

Eu descobri que o compilador não parece saber que os meus parâmetros de modelo são tipos, mas colocando typename diante deles na definição de propriedade não ajuda.

O que está errado? Eu simplesmente quero ter uma classe Graph templated para ter a possibilidade de usar qualquer propriedades que eu gosto, derivadas das estruturas de propriedade básicos acima definidos, para que eu possa ter métodos neste gráfico que operam sobre as propriedades básicas.

Publicado 19/05/2009 em 18:12
fonte usuário
Em outras línguas...                            


1 respostas

votos
7

Estas linhas:

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

deveria estar:

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

A razão é que o compilador não posso dizer que vertex_descriptor é um tipo até o ponto onde você definir o que GraphContainer é (como aquele poderia ser definido em termos do outro).

Esta norma requer que você especificar que este é um tipo em vez de uma variável de membro estático.

Respondeu 19/05/2009 em 18:14
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more