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