C++ 模板类成员 Type alias 声明顺序

2020-08-05 07:36:29 +08:00
 Tony042

代码如下:

template <typename List>
class LargestTypeT;

template <typename List>
class LargestTypeT
{
private:
    using First = Front<List>;
    using Rest = typename 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 类型可以先使用后声明呢,是不是跟模板展开有关?

1546 次点击
所在节点    C++
5 条回复
codehz
2020-08-05 07:57:17 +08:00
是啊,这个属于参数依赖名字查找的范畴
会在实例化的时候才进行决议
(当然了,如果不是参数依赖的名字,仍然按照原始的顺序进行查找
参考 ADL ODR 规则
Tony042
2020-08-05 09:49:31 +08:00
@codehz 好嘞,谢谢
yazoox
2020-08-05 17:00:43 +08:00
楼主,你在 using 别名时,为什么 有的 有`typename`,有的没有?
elfive
2020-08-05 18:20:42 +08:00
@yazoox #3 你不用 typename 关键字,编译器不知道你 typename 后面的是个静态变量还是一个内部类型……
Tony042
2020-08-05 20:08:46 +08:00
@yazoox IfThenEls 和 Front 的定义就是一个模板内部类型,自然是不用的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/695689

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX