1

一部のブースト グラフ コードを関数テンプレートにリファクタリングしようとすると、コンパイル エラーが発生します。

using NODE_TYPE = int;行を関数テンプレート引数に移動しようとしています。

私は何を間違っていますか?

コンパイル エラー

Test_Dijkstra_Graph.cpp:48:28: error: expected type-specifier
Test_Dijkstra_Graph.cpp:48:28: error: expected ‘;’
Test_Dijkstra_Graph.cpp:49:28: error: expected type-specifier
Test_Dijkstra_Graph.cpp:49:28: error: expected ‘;’

古いコードは正常にコンパイルされます

void 
find_shortest_paths_by_pairs()
{
  using NODE_TYPE         = int;
  using EDGE              = std::pair<NODE_TYPE,NODE_TYPE>;
  using GRAPH_T           = adjacency_list< 
        listS, vecS, directedS, no_property, property< edge_weight_t, NODE_TYPE >>;
  using vertex_descriptor = graph_traits<GRAPH_T>::vertex_descriptor;
  using edge_descriptor   = graph_traits<GRAPH_T>::edge_descriptor;
  // ...
}

NEW CODE がコンパイルに失敗する

template<typename NODE_TYPE>
void find_shortest_paths_by_pairs()
{
  using EDGE              = std::pair<NODE_TYPE,NODE_TYPE>;
  using GRAPH_T           = adjacency_list< 
        listS, vecS, directedS, no_property, property< edge_weight_t, NODE_TYPE >>;
  using vertex_descriptor = graph_traits<GRAPH_T>::vertex_descriptor;   // ERROR HERE
  using edge_descriptor   = graph_traits<GRAPH_T>::edge_descriptor;     // ERROR HERE
  // ...
}

// find_shortest_paths_by_pairs<int>();
4

1 に答える 1

5

NODE_TYPEは依存型になるため、いくつかの sGRAPH_Tが必要になります。typename

using vertex_descriptor = typename graph_traits<GRAPH_T>::vertex_descriptor;
using edge_descriptor   = typename graph_traits<GRAPH_T>::edge_descriptor;

(Comeau による FAQ があり、通常はここにリンクして、これが必要な理由の詳細を説明していますが、ドメイン名の有効期限が切れているようです。:-[)

編集: コモーのドメインが復活しました。上記の FAQ: http://www.comeaucomputing.com/techtalk/templates/#typename

于 2013-01-27T02:03:03.997 に答える