我正在通过BGL创建图形,并希望将捆绑属性与vertex_index_t
结合起来,因为图形的VertexProperty
是listS
。
我使用了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
}
答案 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.