1

我对使用 Boost(实际上是 Boost Graph Library)相当陌生,并且正在尝试编写我的第一个图形算法。由于我的算法需要将几个可选和可默认参数传递给它,我想我会尝试使用 Boost::Parameter 库。据我了解,这是对在 BGL 中广泛使用的旧 BGL 命名参数系统的改进。

我一直在学习这里的教程。本教程中的第一个简单示例运行良好,但是当我尝试使用谓词要求检查我的参数是否与算法前置条件匹配时,我得到了很多难以理解的编译器错误。

以下测试代码是本教程中谓词检查示例的精简版本。

#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;
}

这些是来自编译器的错误消息:

t 用作模板参数 'T2' 的模板参数,预期一个真实类型错误 C2955:'boost::is_convertible':使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost ::graph_traits':使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost::graph_traits':使用类模板需要模板参数列表错误 C1903:无法从先前的错误中恢复( s); 停止编译 使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost::graph_traits':使用类模板需要模板参数列表错误 C1903:无法从先前的错误中恢复;停止编译 使用类模板需要模板参数列表错误 C2065:'_':未声明的标识符错误 C2955:'boost::graph_traits':使用类模板需要模板参数列表错误 C1903:无法从先前的错误中恢复;停止编译

我认为问题与括号中的下划线有关: boost::graph_traits<_>::traversal_category

但是我真的不知道发生了什么,并且非常感谢有关如何纠正问题的任何建议。一些指向更多代码示例和用户文档的指针也将非常有帮助。参数库看起来很强大,我准备花一些时间学习如何有效地使用它。

我将 Boost 1.47 与 Microsoft Visual Studio 2010 一起使用。

4

0 回答 0