BGL:不同命名空间中模板的专用化

BGL: specialization of template in different namespace

本文关键字:专用 命名空间 BGL      更新时间:2023-10-16

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

我使用了BGL的方法dijkstra_shortest_path算法方法不接受我的色图外观属性,但是,我最终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;
};
}
}

请帮帮我。

编辑

以下是我目前的解决方案,不知道是否正确。

#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
}

模板显式专用化应在定义模板的命名空间范围内。

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

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

请参阅演示..

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

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

请参阅演示。