将 typedef 移动到函数模板参数时编译错误

Compile error while moving typedef into function template argument

本文关键字:编译 错误 参数 函数模板 typedef 移动      更新时间:2023-10-16

在尝试将一些提升图代码重构为函数模板时,我遇到了一些编译错误。

我正在尝试将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;
  // ...
}

新代码编译失败

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>();

NODE_TYPE会导致GRAPH_T成为依赖类型,因此您需要几个typename

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

(Comeau有一个常见问题解答,我通常会链接到这里,提供有关为什么有必要的更多详细信息,但似乎他们已经让他们的域名过期了。

编辑:嘿,科莫的域名又回来了。说 常见问题解答:http://www.comeaucomputing.com/techtalk/templates/#typename