3

このコードをコンパイルしようとすると:

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 に含めることができます。

4

1 に答える 1

7

これらの行:

    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 が型であることを判断できないためです (一方が他方に関して定義される可能性があるため)。

これは、標準では、これが静的メンバー変数ではなく型であることを指定する必要があります。

于 2009-05-19T17:14:19.463 に答える