#include <iostream>

template <typename T>
struct Base
{
    using Type = int;
};

template <typename T>
struct intermediate : Base<T>
{
	// using Type = typename intermediate<T>::Type; // Not needed
};

template <typename T>
struct Derived : intermediate<T>
{
    using Type =  intermediate<T>::Type;
};

int main()
{
    Derived<void>::Type b = 1;
    std::cout << b << std::endl;
}