C++ Boost

Trouble Shooting


GNU C++ で、もし次のようなエラーが現れたら:
boost/type_traits/arithmetic_traits.hpp:243: template instantiation depth exceeds maximum of 17
boost/type_traits/arithmetic_traits.hpp:243:  (use -ftemplate-depth-NN to increase the maximum)
エラーメッセージの言うように template 実体化の深さを増やす必要がある。 普通は g++ に -ftemplate-depth-30 フラグを渡すことでうまくいく。
error C2784: 'T __cdecl source(struct std::pair,const G &)' : 
could not deduce template argument for 'struct std::pair<_T1,_T1>' from
 'class boost::detail::bidir_edge'

VC++ は Koenig Lookup をサポートしていないので、 boost:: を使って boost 名前空間で定義された関数を 参照する必要がある。つまり、 source(e, g) ではなく boost::source(e, g) とする。


../../..\boost/property_map.hpp(283) : error C2678: binary '[' : no operator defined
 which takes a left-hand operand of type 'const struct boost::adj_list_edge_property_map,unsigned int,enum boost::edge_weight_t>' (or there is no acceptable conversion)

get(property, graph, edge) を使う際に見られる VC++ のバグ。 回避策は、代わりに get(get(property, graph), edge) を使うことである。


C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\xmemory(59) : fatal
error C1001: INTERNAL COMPILER ERROR
        (compiler file 'msc1.cpp', line 1786)

このエラーには多くの原因があり得るが、時々、 /Gm (最小リビルド) フラグ が原因で起こることがある。 このフラグが本当に必要でないのなら、オフにするのは良い考えである。

このエラーの他の原因に、 BGL アルゴリズムの多くで使われている 名前付きパラメータ インタフェース (named-parameter interface) がある。 名前無しパラメータ (non named-parameter) 版のアルゴリズムを代わりに試してみて 欲しい (当該アルゴリズムの HTML ドキュメントを参照) 。

また別の理由としては、 PropertyGraph インタフェースの get() 関数の利用が挙げられる。 複雑な式で get() 関数を使う代わりに、常にまずプロパティマップ変数を最初に宣言する ようにすること:

property_map<graph_t, edge_weight_t>::type w_map = get(edge_weight, g);
// w_map を使う ...

V:\3rdPARTY\SXL\INCLUDE\xlocnum(309) : error C2587: '_U' : illegal
 use of local variable as default parameter

Andreas Scherer による回避方法:
これは MSVC-- 6.0 sp[34] で BGL の例のいくつかを(それとも全部?)コンパイルする 際によく起こる問題だ。 DLL バージョンの run-time システムを使うことはできない。 僕は ``[Debug] Multithreaded'' (``Project Settings`` の ``C/C++'' ページの ``Code Generation'' セクションにある) に切り替えたら file_dependencies.cpp を コンパイルできた。

このエラーのもう一つの原因は adjacency_list のイテレータコンストラクタが 使われたことである。 回避策は、代わりに add_edge() を使うこと。 例えば:

Graph g(edge_array, edge_array + n_edges, N);
これは以下のように置き換える:
Graph g(N);
for (std::size_t j = 0; j < n_edges; ++j)
  add_edge(edge_array[j].first, edge_array[j].second, g);



Copyright © 2000-2001 Jeremy Siek, Indiana University (jsiek@osl.iu.edu)
Lie-Quan Lee, Indiana University (llee@cs.indiana.edu)
Andrew Lumsdaine, Indiana University (lums@osl.iu.edu)

Japanese Translation Copyright © 2003 Kent.N
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。