代码如下:
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 类型可以先使用后声明呢,是不是跟模板展开有关?
1
codehz 2020-08-05 07:57:17 +08:00 via Android
是啊,这个属于参数依赖名字查找的范畴
会在实例化的时候才进行决议 (当然了,如果不是参数依赖的名字,仍然按照原始的顺序进行查找 参考 ADL ODR 规则 |
3
yazoox 2020-08-05 17:00:43 +08:00
楼主,你在 using 别名时,为什么 有的 有`typename`,有的没有?
|
4
elfive 2020-08-05 18:20:42 +08:00 via iPhone
@yazoox #3 你不用 typename 关键字,编译器不知道你 typename 后面的是个静态变量还是一个内部类型……
|