Проблемы с использованием предикатной проверки в библиотеке параметров Boost

Я довольно новичок в использовании Boost (фактически, библиотеки графов Boost) и пытаюсь написать свой первый алгоритм графов. Поскольку мой алгоритм потребует, чтобы ему были переданы несколько необязательных и устанавливаемых по умолчанию параметров, я решил попробовать использовать библиотеку 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;
}

Это сообщения об ошибках от компилятора:

ошибка 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': шаблон неспециализированного класса нельзя использовать в качестве аргумента шаблона для параметр шаблона 'T1', ожидается реальная ошибка типа C2955: 'boost::is_convertible': использование шаблона класса требует ошибки списка аргументов шаблона C3203: 'is_convertible': шаблон неспециализированного класса нельзя использовать в качестве аргумента шаблона для параметра шаблона 'T2', ожидается ошибка реального типа C2955: 'boost::is_convertible': использование шаблона класса требует ошибки списка аргументов шаблона C2065: '_': ошибка необъявленного идентификатора C2955: 'boost::graph_traits': использование шаблона класса требует ошибка списка аргументов шаблона C2065: '_': undec ошибка идентификатора Lared C2955: 'boost::graph_traits': использование шаблона класса требует ошибки списка аргументов шаблона C1903: невозможно восстановить после предыдущей ошибки; остановка компиляции

Я думаю, что проблема связана с подчеркиванием в скобках в строках типа: boost:: graph_traits<_>:: traversal_category

Однако я действительно не знаю, что происходит, и был бы очень признателен за любые советы о том, как исправить вещи. Некоторые ссылки на дополнительные примеры кода и пользовательскую документацию для этого также будут очень полезны. Библиотека параметров выглядит очень мощной, и я готов потратить некоторое время на изучение того, как ее эффективно использовать.

Я использую Boost 1.47 с Microsoft Visual Studio 2010.

0 ответов

Другие вопросы по тегам