Рассмотрим следующее:
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)