使用Boost参数库进行谓词检查的问题

时间:2012-08-16 11:39:29

标签: c++ boost boost-graph boost-parameter

我很擅长使用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。

0 个答案:

没有答案