使用捆绑属性创建 C++ Boost 图形

Posted

技术标签:

【中文标题】使用捆绑属性创建 C++ Boost 图形【英文标题】:On C++ Boost Graph Creation With Bundled Properties 【发布时间】:2014-08-01 14:59:25 【问题描述】:

我正在尝试设置具有捆绑属性的顶点 Boost Graph。不幸的是,“add_edge”步骤似乎不起作用,导致以下错误。任何见解都会有所帮助!

error: constructor for 'boost::detail::adj_list_gen<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Node,boost::no_property, boost::no_property, boost::listS>, boost::vecS, boost::vecS, boost::undirectedS, Node, boost::no_property, boost::no_property, boost::listS>::config::rand_stored_vertex' must explicitly initialize the member 'm_property' which does not have a default constructor rand_stored_vertex()

以及一系列其他此类声明,最终导致以下内容:

in instantiation of function template specialization 'boost::add_edge<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Node, boost::no_property,boost::no_property, boost::listS>, boost::detail::adj_list_gen<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Node, boost::no_property, boost::no_property,boost::listS>, boost::vecS, boost::vecS, boost::undirectedS, Node, boost::no_property, boost::no_property, boost::listS>::config,boost::undirected_graph_helper<boost::detail::adj_list_gen<boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Node, boost::no_property, boost::no_property, boost::listS>,boost::vecS, boost::vecS, boost::undirectedS, Node, boost::no_property, boost::no_property, boost::listS>::config> >' requested here boost::add_edge( svlist[0], svlist[1], SG );

class Node 
public: 
  std::string id;
  Node(int a) 
    id = std::to_string(a);
   
;

std::vector<Node> nodelist;
Node n1(1);
Node n2(2);
Node n3(3);
Node n4(4);
nodelist.push_back(n1);
nodelist.push_back(n2);
nodelist.push_back(n2);
nodelist.push_back(n4);

typedef boost::adjacency_list< boost::vecS, boost::vecS, 
                                      boost::undirectedS, Node> ScafGraph;
typedef boost::graph_traits<ScafGraph>::vertex_descriptor SV;
typedef boost::graph_traits<ScafGraph>::edge_descriptor SE;

ScafGraph SG;

std::vector<SV> svlist;
for(int i=0; i<4; i++) 
    SV v = boost::add_vertex( nodelist[i], SG );
    svlist.push_back(v);


SE e; bool ok;
boost::tie(e, ok) = boost::edge( svlist[0], svlist[1], SG );
if(!ok) 
    boost::add_edge( svlist[0], svlist[1], SG );

【问题讨论】:

我不明白 "boost::tie ..." 行的作用。如果你把它注释掉会发生什么? @ravenspoint boost::tie(e,ok) 调用用于检查在添加新边的过程中是否会发生任何错误(例如,当已经存在时)。谢谢。 【参考方案1】:

Node 类中有一些错误。在 Windows 中使用 C++11 在 GCC 4.9.0 中测试。

class Node 
public:
    std::string id;
    Node(int a)  id = std::to_string(a); 
    Node() = default;
;
Node 后面的括号错误。 接收int并转换为字符串的构造函数,在转换中参数was not used。 在使用vecS 时将vertexedge 添加到图形需要使用的节点具有默认构造函数,因为向量可能需要增长并重新分配元素,当它增长时元素是默认构造。对于您的自定义节点,没有默认构造函数。

【讨论】:

谢谢!我在复制代码时犯了一个错误;取下大括号。但是默认构造函数是问题所在。 为我修复的默认构造函数。谢谢

以上是关于使用捆绑属性创建 C++ Boost 图形的主要内容,如果未能解决你的问题,请参考以下文章

c++晚捆绑的实现机制

将 mono 与嵌入它的 c++ 应用程序捆绑在一起

Retina 图形未从 NSBundle 加载

单点触控更改捆绑路径

为啥 C++ 标准库与编译器而不是操作系统捆绑在一起?

pybind11 解释器使用捆绑的 python 可执行文件