在bgl iteration_makros.hpp中,它说
当图表类型是模板参数或时,使用_T版本 取决于模板参数。否则使用非_T版本。
e.g:
#define BGL_FORALL_EDGES_T(ENAME, GNAME, GraphType) \
for (std::pair<typename boost::graph_traits<GraphType>::edge_iterator, \
typename boost::graph_traits<GraphType>::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
for (typename boost::graph_traits<GraphType>::edge_descriptor ENAME; \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \
++BGL_FIRST(__LINE__))
VS
#define BGL_FORALL_EDGES(ENAME, GNAME, GraphType) \
for (std::pair<boost::graph_traits<GraphType>::edge_iterator, \
boost::graph_traits<GraphType>::edge_iterator> BGL_RANGE(__LINE__) = edges(GNAME); \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__); BGL_FIRST(__LINE__) = BGL_LAST(__LINE__)) \
for (boost::graph_traits<GraphType>::edge_descriptor ENAME; \
BGL_FIRST(__LINE__) != BGL_LAST(__LINE__) ? (ENAME = *BGL_FIRST(__LINE__), true):false; \
++BGL_FIRST(__LINE__))
我看到的唯一区别 - stackoverflow足以在代码中强调这一点 - 是_T版本中的typename
修饰符。
现在,我对这个整个类型名称和模板的东西并不十分精明,但为什么要提供两个版本呢?为什么_T版本不够用?有人能给我一个我不能使用_T版本的例子吗?
或者,如果没有这样的例子,背后的原因是什么?
在相关的说明中,使用BGL的捆绑属性是否算作图表依赖于模板参数&#34;?
答案 0 :(得分:2)
使用C ++ 03,typename
关键字可以准确地被允许。也就是说,如果一个从属名称是一个类型,那就是必要的。如果类型不是从属名称,则不允许使用。因此,根据您是否在模板内,可能是允许的,也可能是必需的,也不是必需的。
使用C ++ 11时,在引用嵌套类型时总是允许typename
关键字,即使用C ++ 11,不再需要两个版本和_T
- 版本已经足够了。