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 を使用しています。