#include <iostream>
template <typename T>
struct Base
{
using Type = int;
};
template <typename T>
struct intermediate : Base<T>
{
// 'Type' is not defined here, which is fine
};
template <typename T>
struct Derived : intermediate<T>
{
using Type = typename Derived<T>::Type; // Is this legal?
// using Type = typename intermediate<T>::Type; // Normal way of doing it
};
int main()
{
Derived<void>::Type b = 1;
std::cout << b << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBCYXNlCnsKICAgIHVzaW5nIFR5cGUgPSBpbnQ7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IGludGVybWVkaWF0ZSA6IEJhc2U8VD4KewogICAgLy8gJ1R5cGUnIGlzIG5vdCBkZWZpbmVkIGhlcmUsIHdoaWNoIGlzIGZpbmUKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgRGVyaXZlZCA6IGludGVybWVkaWF0ZTxUPgp7CiAgICB1c2luZyBUeXBlID0gdHlwZW5hbWUgRGVyaXZlZDxUPjo6VHlwZTsgLy8gSXMgdGhpcyBsZWdhbD8KLy8gICAgdXNpbmcgVHlwZSA9IHR5cGVuYW1lIGludGVybWVkaWF0ZTxUPjo6VHlwZTsgLy8gTm9ybWFsIHdheSBvZiBkb2luZyBpdAp9OwoKaW50IG1haW4oKQp7CiAgICBEZXJpdmVkPHZvaWQ+OjpUeXBlIGIgPSAxOwogICAgc3RkOjpjb3V0IDw8IGIgPDwgc3RkOjplbmRsOwp9