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

コンパイラからのエラー メッセージは次のとおりです。

テンプレート パラメーター '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 のような行の括弧で囲まれたアンダースコアと関係があると思います

ただし、何が起こっているのか本当にわかりません。問題を修正する方法についてアドバイスをいただければ幸いです。これに関するより多くのコード サンプルとユーザー ドキュメントへのポインタも非常に役立ちます。パラメータ ライブラリは非常に強力に見えます。効果的な使用方法を学ぶために時間を費やす準備ができています。

Microsoft Visual Studio 2010 で Boost 1.47 を使用しています。

4

0 に答える 0