我试图用 boost :: adjacency_matrix 图表作为成员来创建自己的类,但是我仍然遇到编译错误。无法编译的示例类:
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 作为班上的一员?
答案 0 :(得分:0)
如果未指定其他任何内容作为初始化程序,则使用默认构造函数对类的对象成员进行初始化。似乎adjacency_matrix没有默认构造函数。
你应该做这样的事情:
typedef boost :: adjacency_matrix Graph;
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所以我不知道好的做法和真正有意义的。我只是从错误信息中获取了这个。
答案 1 :(得分:0)
编译器告诉你boost :: adjacency_matrix没有不带参数的构造函数,因此它无法构造一个作为类成员的构造函数。类的对象成员必须在构造包含类的同时构造,除非您另行指定,否则编译器会假定没有可以调用的参数的构造函数。如果没有,你会得到这样的错误。
解决方案是在构造函数的初始化列表中为g的构造函数提供参数:
SampleClass() : g( ... )
{
}
其中......是相应的构造函数参数,无论adjacency_matrix的构造函数是否为您提供所需的对象。这将覆盖编译器的默认本能以尝试调用0参数构造函数,并使其调用与您提供的参数匹配的任何一个。
如果你不想在你班级的建设时间做这件事,你必须存储一个指向它的指针并在适当的时候用new构建它。或者更好的是,将shared_ptr存储到它,这样您就不必担心在类被销毁时删除它。
答案 2 :(得分:0)
据我所知,Graph没有默认构造函数。
您应该提供参数,因此请参阅documentation。