在以下情况下,注入的类名被视为类模板本身的模板名:
- 它后面是 <
- 它用作对应于模板模板参数的模板参数
- 它是友元类模板声明的详细类说明符中的最终标识符。
因此,我尝试检查所有 3 个案例(此外,在基本歧义的背景下,尽管我认为这在这里无关紧要)。
第一种情况看起来很简单。
问题是 - 为什么不注释掉的例子有效?他们不在 GCC 和 Clang 上,所以我认为这不是实施问题
template <template <class> class> struct A;
template <class T> struct Base {};
template <class T> struct Derived: Base<int>, Base<char>
{
// #1
typename Derived::Base<double> d;
// #2
// using a = A<Base>;
using a = A<Derived::template Base>;
// #3
template<class U1>
friend struct Base;
// template<class U>
// friend struct Derived::template Base;
};
上面的规则是否仅适用于模板本身,而不适用于基础?如果是这样,基地的规则是什么,尤其是最后两个案例?