繁体   English   中英

为什么在graph_traits <>中使用模板化typedef时,g ++为什么会抱怨?

[英]Why does g++ complain when using templated typedefs 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 ++在“ 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中使用对基本属性进行操作的方法。

这些行:

    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;

原因是直到定义定义GraphContainer的那一刻,编译器才知道vertex_descriptor是一种类型(因为一个可能可以用另一个定义)。

该标准要求您指定这是类型而不是静态成员变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM