考虑以下:
template<typename X>
struct Z {};
struct A
{
using Z = ::Z<int>;
struct B : Z
{
using C = Z;
};
};
这编译得很好。好的。但是现在添加另一个参数Z
:
template<typename X, typename Y>
struct Z {};
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>; // error: too few template arguments for class template 'Z'
};
};
好的,也许在派生嵌套类时Z
,类中模板别名的定义是可见的,但在其主体内不可见,这会触发错误,因为全局定义有两个参数。A
B
Z
但是为什么在第一种情况下行为不同,什么时候Z
只是类型别名A
?
最后,制作A
一个模板:
template<typename X, typename Y>
struct Z {};
template<typename T>
struct A
{
template<typename X>
using Z = ::Z<X, int>;
struct B : Z<B>
{
using C = Z<B>;
};
};
现在错误消失了。为什么?
(在 Clang 3.6 和 GCC 4.9.2 上测试)