我可以用我自己的类包装boost graph吗?
Can I wrap boost graph with my own class
我试图用boost::adjacency_matrix graph作为成员创建自己的类,但我被困在编译错误上。不能编译的样例类:
namespace zto {
typedef boost::adjacency_matrix<boost::undirectedS> Graph;
class SampleClass
{
public:
Graph g;
SampleClass();
};
编译错误:
./src/sample.cpp: In constructor ‘zto::SampleClass::SampleClass()’:
./src/sample.cpp:27:31: error: no matching function for call to
‘boost::adjacency_matrix<boost::undirectedS>::adjacency_matrix()’
./src/sample.cpp:27:31: note: candidates are:
/usr/include/boost/graph/adjacency_matrix.hpp:622:5: note: template<class EdgeIterator,
class EdgePropertyIterator> boost::adjacency_matrix::adjacency_matrix(EdgeIterator,
EdgeIterator, EdgePropertyIterator, boost::adjacency_matrix<Directed, VertexProperty,
EdgeProperty, GraphProperty, Allocator>::vertices_size_type, const GraphProperty&)
/usr/include/boost/graph/adjacency_matrix.hpp:604:5: note: template<class EdgeIterator>
boost::adjacency_matrix::adjacency_matrix(EdgeIterator, EdgeIterator,
boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty,
Allocator>::vertices_size_type, const GraphProperty&)
/usr/include/boost/graph/adjacency_matrix.hpp:593:5: note:
boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty, GraphProperty,
Allocator>::adjacency_matrix(boost::adjacency_matrix<Directed, VertexProperty,
EdgeProperty, GraphProperty, Allocator>::vertices_size_type, const GraphProperty&)
[with Directed = boost::undirectedS, VertexProperty = boost::no_property, EdgeProperty
= boost::no_property, GraphProperty = boost::no_property, Allocator =
std::allocator<bool>, boost::adjacency_matrix<Directed, VertexProperty, EdgeProperty,
GraphProperty, Allocator>::vertices_size_type = unsigned int]
/usr/include/boost/graph/adjacency_matrix.hpp:593:5: note: candidate expects 2
arguments, 0 provided
/usr/include/boost/graph/adjacency_matrix.hpp:474:9: note:
boost::adjacency_matrix<boost::undirectedS>::adjacency_matrix(const
boost::adjacency_matrix<boost::undirectedS>&)
/usr/include/boost/graph/adjacency_matrix.hpp:474:9: note: candidate expects 1
argument, 0 provided
看起来编译器认为Graph是一个函数?
谁能告诉我,如何声明boost::adjacency_matrix作为我的类的成员?
如果不指定任何其他初始化器,则使用默认构造函数初始化类的对象成员。似乎邻接ency_matrix没有默认构造函数
你应该这样做:
typepedef boost::adjacency_matrix;
class SampleClass
{
public:
Graph g;
SampleClass(size_t arg)
: g(arg) // this is important
{
// As before, can also be in a cpp.
// It is just important that the initializer is used.
}
};
当然,在实践中你也可以使用其他构造函数参数,使用你赢得的默认值,等等。这应该是一个非常简单的例子。我从来没有使用过boost::adjecency_matrix,所以我不知道什么是好的实践,什么是有意义的。
编译器告诉你boost::adjacency_matrix没有一个不带参数的构造函数,所以它不能构造一个作为你的类的成员。类的对象成员必须在构造包含类的同时构造,除非您另行指定,否则编译器会假定存在一个没有参数的构造函数供其调用。如果没有,你会得到这样的错误。
解决方案是在构造函数的初始化列表中为g的构造函数提供参数:SampleClass() : g( ... )
{
}
Where the…是一个适当的构造函数参数,用于任何一个adjacency_matrix的构造函数,该构造函数为您提供所需的对象。这将覆盖编译器尝试调用0参数构造函数的默认本能,并使其调用与您提供的参数匹配的构造函数。
如果你不想在构造类的时候这样做,你必须存储一个指向它的指针,并在适当的时候用new构造它。或者更好的是,存储一个shared_ptr,这样你就不必担心在你的类被销毁时删除它。
据我所知,Graph没有默认构造函数。
您应该提供一个参数,因此只需参考文档。
相关文章:
- Boost Graph Library,修复节点大小
- Boost Graph库,depth_first_search未在MSVC中调用finish_edge
- 如何在Boost Graph库中的Grid_graph的边缘添加自定义属性
- 在Boost Graph库中选择给定顶点的随机进出邻居的有效方法
- 如何使用Boost Graph库使用循环中的循环设置相同的边缘重量
- Boost Graph库示例不编译
- 带标签_Graph的Boost Graph bellman_ford_shortest_path
- Boost Graph库中边缘的随机访问(或其他快速访问)
- 在 Boost.Graph 中向图形添加边
- Boost Graph Library:如何使用depth_first_visit,ColorMap的问题
- 在Boost Graph中使用find()在Boost关联属性图中使用Find()错误
- 在Fortran程序中使用Boost Graph库(BGL)
- 使用Boost :: Graph随机访问顶点
- 在Boost Graph中过滤到现有的Filtered_graph
- 在Boost Graph中定义了图形后,在构造函数中初始化了effled_graph对象
- Boost::Graph中的read_graphviz(),传递给构造函数
- 使用Boost graph库创建图形
- 在执行 DFS 时在 Boost::graph 中维护迭代器
- 从Boost Graph中删除多个顶点
- 用 boost::graph 包装我的自定义图形并计算dijkstra_shortest_paths