这里的相关规则是
[temp.local]/4
:
查找注入的类名([class.member.lookup])可能会在某些情况下导致歧义(例如,如果在多个基类中找到)。如果找到的所有注入类名都引用同一类模板的专门化,并且如果该名称用作
模板名称
,该引用引用类模板本身,而不是其专门化,并且没有歧义。
[示例:
template <class T> struct Base { };
template <class T> struct Derived: Base<int>, Base<char> {
typename Derived::Base b; // error: ambiguous
typename Derived::Base<double> d; // OK
};
结束示例]
我认为这意味着这是一个gcc和一个叮当作响的bug。在中:
using a = A<Base>;
找到的所有注入类名都引用同一类模板的专门化(
Base<T>
)
和
该名称用作
模板名称
(因为它是模板模板参数的模板参数),所以这应该只引用类模板本身,而不是模棱两可的。