我很擅长使用Boost(实际上是Boost Graph Library),我正在尝试编写我的第一个图算法。由于我的算法需要将几个可选和可默认的参数传递给它,我想我会尝试使用Boost :: Parameter库。据我所知,这是对BGL中广泛使用的旧BGL命名参数系统的改进。
我一直在使用教程here。本教程中的第一个简单示例工作正常,但当我尝试使用谓词要求检查我的参数是否与算法前置条件匹配时,我得到了许多难以理解的编译器错误。
以下测试代码是本教程中谓词检查示例的精简版本。
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/parameter/keyword.hpp>
#include <boost/parameter/name.hpp>
#include <boost/parameter/preprocessor.hpp>
namespace graphs
{
BOOST_PARAMETER_NAME(graph)
BOOST_PARAMETER_FUNCTION(
(void), my_algorithm, tag,
(required
(graph,
*(boost::mpl::and_<
boost::is_convertible<
boost::graph_traits<_>::traversal_category
, boost::incidence_graph_tag
>
, boost::is_convertible<
boost::graph_traits<_>::traversal_category
, boost::vertex_list_graph_tag
>
>)
)
)
)
{
// ... body of function goes here...
std::cout << "graph=" << graph << std::endl;
}
}
int main(int argc, char* argv[])
{
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS> Graph;
Graph g(3); // Create a graph with 3 vertices.
boost::add_edge(0, 1, g);
boost::add_edge(1, 2, g);
graphs::my_algorithm(graphs::_graph = g);
return 0;
}
这些是来自编译器的错误消息:
错误C2065:'_':未声明的标识符 错误C2923:'boost :: is_convertible' :'boost :: graph_traits :: traversal_category'不是参数'From'的有效模板类型参数 错误C2065:'_':未声明的标识符 错误C2923:'boost :: is_convertible' :'boost :: graph_traits :: traversal_category'不是参数'From'的有效模板类型参数 错误C3203:'is_convertible' :unspecialized类模板不能用作模板参数'T1'的模板参数, 期待一个真正的类型 错误C2955:'boost :: is_convertible':使用类模板需要模板参数列表 错误C3203:'is_convertible' :unspecialized类模板不能用作模板参数'T2'的模板参数, 期待一个真正的类型 错误C2955:'boost :: is_convertible':使用类模板需要模板参数列表 错误C2065:'_':未声明的标识符 错误C2955:'boost :: graph_traits':使用类模板需要模板参数列表 错误C2065:'_':未声明的标识符 错误C2955:'boost :: graph_traits':使用类模板需要模板参数列表 错误C1903:无法从先前的错误中恢复;停止编译
我认为这个问题与以下行中带括号的下划线有关: 升压:: graph_traits&LT; _&GT; :: traversal_category
然而,我真的不知道发生了什么,并且非常感谢任何关于如何纠正事情的建议。一些指向更多代码示例和用户文档的指针也非常有用。参数库看起来非常强大,我准备花些时间学习如何有效地使用它。
我在Microsoft Visual Studio 2010中使用Boost 1.47。