BGL:不同名称空间中的模板专业化

时间:2019-04-16 09:09:16

标签: c++ boost-graph

我正在通过BGL创建图形,并希望将捆绑属性与vertex_index_t结合起来,因为图形的VertexPropertylistS

我使用了BGL dijkstra_shortest_path algorithm method does not accept my color map exterior property中的方法,但是最终出现了specialization of template in different namespace错误。

#include <boost/graph/adjacency_list.hpp>

namespace MyNameSpace {

using namespace boost;

struct VertexP {
    std::string name;
    unsigned int id;
};

typedef adjacency_list<vecS, listS, bidirectionalS, VertexP> Graph;

class VertexIndexMap {
public:
    typedef boost::readable_property_map_tag category;
    typedef size_t  value_type;
    typedef value_type reference;
    typedef Graph::vertex_descriptor key_type;

    VertexIndexMap(const Graph& g): _g(&g) {}

    const Graph * _g;
};

template<>
struct property_map<Graph, vertex_index_t > {
    typedef VertexIndexMap const_type;
};

}

我尝试了以下代码,但没有用。

namespace MyNameSpace {

namespace boost {
template<>
struct property_map<Graph, vertex_index_t > {
    typedef VertexIndexMap const_type;
};

}

}

请帮帮我。

EDIT

下面是我当前的解决方案,不知道它是否正确。

#include <boost/graph/adjacency_list.hpp>

namespace MyNameSpace {

using namespace boost;

struct VertexP {
    std::string name;
    unsigned int id;
};

typedef adjacency_list<vecS, listS, bidirectionalS, VertexP> Graph;

class VertexIndexMap {
public:
    typedef boost::readable_property_map_tag category;
    typedef size_t  value_type;
    typedef value_type reference;
    typedef Graph::vertex_descriptor key_type;

    VertexIndexMap(const Graph& g): _g(&g) {}

    const Graph * _g;
};

}

namespace boost {

template<>
struct property_map<Graph, vertex_index_t > {
    typedef VertexIndexMap const_type;
};

}

namespace MyNameSpace {
  // the remaining code in namespace MyNameSpace
}

1 个答案:

答案 0 :(得分:1)

模板的显式特殊化应在定义模板的名称空间的范围内。

由于您发布的代码不是一个最小的示例,因此这里是一个重现此问题的最小示例。

namespace A {
    template<class T> class X { /* ... */ };
    namespace B {
        template<> class X<int> { /* ... */ };
    }
}

请参见Demo.

要编译上面的示例,您可以将特殊化从namespace B中移出 或者甚至可以将其从namespace A中移出,前提是在专门化时使用嵌套名称说明符。

template<> class A::X<int> { /* ... */ };

请参见Demo.