
代码如下:
template <typename List> class LargestTypeT; template <typename List> class LargestTypeT { private: using First = Front<List>; using Rest = tpename LargestTypeT<PopFront<List>>::Type; public: using Type = IfThenElse<(sizeof(First) >= sizeof(Rest)), First, Rest>; }; template <> class LargestTypeT<Typelist<>> { public: using Type = char; }; template <typename List> using LargestType = typename LargestTypeT<List>::Type; 在类 LargestTypeT 中 Type 的声明顺序是晚于 First 和 Rest 的,但是 Rest 可以成功成为 LargestTypeT<PopFront<List>>::Type 的别名呢(尽管 Type 在 Rest 之后声明)。我也尝试调换 private 和 public 的顺序(先声明 Type, 再声明 First,Rest)这样的话编译器就会报错( First and Rest are not declared )。我很好奇为什么 Type 类型可以先使用后声明呢,是不是跟模板展开有关?
1 codehz 2020 年 8 月 5 日 via Android 是啊,这个属于参数依赖名字查找的范畴 会在实例化的时候才进行决议 (当然了,如果不是参数依赖的名字,仍然按照原始的顺序进行查找 参考 ADL ODR 规则 |
3 yazoox 2020 年 8 月 5 日 楼主,你在 using 别名时,为什么 有的 有`typename`,有的没有? |