В лоб (не работает):
template <typename T>
struct A
{
struct Tag1;
template <typename U>
struct B;
typedef B<Tag1> Tag1_t;
};
//fail
template <typename T> template <typename U>
struct A<T>::B<U>
{
};
//fail
template <typename T> template <typename U>
struct A<T>::B<typename A<T>::Tag1>
{
};
Через специализацию (работает):
template <typename T>
struct A
{
struct Tag1;
template <typename U>
struct B;
typedef B<Tag1&> Tag1_t;
};
//OK
template <typename T> template <typename U>
struct A<T>::B<U&>
{
};
Но 1е и 2е — это разные вещи. 1й вариант не возможен? Или я что-то не понимаю?