kfm*_*e04 1 c++ templates typedef c++11
在尝试将一些boost图形代码重构为函数模板时,我遇到了一些编译错误.
我试图将该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 ‘;’
Run Code Online (Sandbox Code Playgroud)
旧代码编译好
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;
// ...
}
Run Code Online (Sandbox Code Playgroud)
新代码无法编译
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>();
Run Code Online (Sandbox Code Playgroud)
NODE_TYPE导致GRAPH_T成为依赖类型,所以你需要几个typenames:
using vertex_descriptor = typename graph_traits<GRAPH_T>::vertex_descriptor;
using edge_descriptor = typename graph_traits<GRAPH_T>::edge_descriptor;
Run Code Online (Sandbox Code Playgroud)
(Comeau有一个常见问题解答,我通常会链接到这里,提供有关为什么这是必要的更多细节,但似乎他们已经让他们的域名过期.: - [)
编辑:嘿,Comeau的域名回来了.所述FAQ:http://www.comeaucomputing.com/techtalk/templates/#typename
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |