1

我正在尝试使用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声明为我班级的成员?

4

3 回答 3

0

如果您没有指定其他任何东西作为初始化程序,则使用默认构造函数初始化您的类的对象成员。似乎 adjacency_matrix 没有默认构造函数。

你应该这样做:

typedef 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 所以我不知道好的做法和真正有意义的东西。我只是从错误消息中得到这个。

于 2011-10-31T11:53:02.253 回答
0

编译器告诉您 boost::adjacency_matrix 没有不带参数的构造函数,因此它无法将其构造为类的成员。类的对象成员必须在构造包含类的同时构造,除非您另外指定,否则编译器假定有一个没有参数的构造函数可以调用。如果没有,你会得到这样的错误。

解决方案是在构造函数的初始化列表中为 g 的构造函数提供参数:

SampleClass() : g( ... )
{
}

其中 ... 是适当的构造函数参数,用于 adjacency_matrix 的构造函数之一为您提供所需的对象。这将覆盖编译器的默认本能,尝试调用 0 参数构造函数,并使其调用与您提供的参数匹配的任何一个。

如果您不想在类的构建时执行此操作,则必须存储指向它的指针并在适当的时间使用 new 构建它。或者更好的是,将 shared_ptr 存储到其中,这样您就不必担心在您的类被销毁时删除它。

于 2011-10-31T11:53:02.337 回答
0

据我了解,Graph 没有默认构造函数。

您应该提供一个参数,所以只需参考文档

于 2011-10-31T11:53:48.610 回答