调用Boost add_edge函数出现“no function to call”错误求助
解决Boost Graph中
add_edge调用"no function to call"错误的思路 我之前在使用Boost Graph Library(BGL)时也碰到过一模一样的问题,结合你给出的代码片段和错误信息,大概率是这几个细节没处理对,咱们一步步排查:
1. 先检查Graph类型的模板参数是否匹配
BGL的adjacency_list(你用的应该是这个吧?)是模板类,必须明确指定顶点属性、边属性这些参数。如果你的Graph定义里的边属性类型和你传入的edgeProperties不匹配,编译器就找不到对应的add_edge重载。
举个正确的Graph定义例子:
struct vertexProperties { // 你的顶点属性字段,比如id、坐标之类的 }; struct edgeProperties { // 你的边属性字段,比如权重、长度之类的 }; // 注意最后两个参数是顶点属性和边属性,要和你定义的结构体对应 typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertexProperties, edgeProperties> Graph;
如果你的Graph定义里没把edgeProperties作为边属性参数,那调用add_edge(i, j, e, g)就会因为参数类型不匹配报错——因为BGL的add_edge不会接受一个和Graph定义无关的属性结构体。
2. 检查add_edge的调用参数顺序和完整性
从你截断的代码来看,Gra...明显是没写完的部分,大概率是调用add_edge时出了问题:
- 正确的
add_edge重载有两种常用形式:- 带边属性:
boost::add_edge(u, v, edge_prop, graph) - 不带边属性:
boost::add_edge(u, v, graph)
要是你把参数顺序搞反了(比如把graph放在前面),或者漏传了必要参数,编译器肯定找不到匹配的函数。
- 带边属性:
- 另外,你用的
i、j是不是合法的Graph::vertex_descriptor类型?如果你的Graph用的是vecS作为顶点容器,那vertex_descriptor就是整数类型,i和j得是0到n-1的合法值;要是用的是listS,那得用boost::add_vertex返回的descriptor对象,不能直接用整数。
3. 别漏了命名空间
很多人容易忘加Boost的命名空间,要是你的代码里没有using namespace boost;,也没有用boost::add_edge的全名调用,编译器会把add_edge当成普通函数,自然找不到对应的实现。
补个完整的示例参考
假设你的输入文件格式是先n(顶点数),然后起始/终止顶点id,接着是若干行的边数据,那完整的initializeGraph可以这么写:
#include <boost/graph/adjacency_list.hpp> #include <fstream> using namespace boost; struct vertexProperties { int id; // 其他顶点属性... }; struct edgeProperties { // 你的边属性,比如权重 double weight; }; typedef adjacency_list<vecS, vecS, undirectedS, vertexProperties, edgeProperties> Graph; void initializeGraph(Graph &g, Graph::vertex_descriptor &start, Graph::vertex_descriptor &end, ifstream &fin) { edgeProperties e; int n, i, j; int startId, endId; fin >> n; fin >> startId >> endId; // 先添加所有顶点 for (int k = 0; k < n; ++k) { Graph::vertex_descriptor v = add_vertex(g); g[v].id = k; // 根据id匹配起始/终止顶点 if (k == startId) start = v; if (k == endId) end = v; } // 读取边数据并添加 while (fin >> i >> j >> e.weight) { // 假设边数据格式是i j weight add_edge(i, j, e, g); // 无向图无需重复添加,BGL会自动处理双向边 } }
你可以对照这个示例,检查自己的代码哪里不符合要求,尤其是Graph定义、add_edge的参数顺序和命名空间这几点,应该就能解决问题了。
内容的提问来源于stack exchange,提问作者user9241855
相关产品推荐
相关产品推荐

