#include <iostream>
#include <vector>

struct First {
	template <typename T>
	using ArrayType = std::vector<T>;
};

template <typename T>
struct Second {
	void go() { std::cout << "General\n"; }
};

template <typename T>
struct Second < typename First::template ArrayType<T> > {
	void go() { std::cout << "Specialized\n"; }
};

int main() {
	Second < std::vector<int> > second;
	second.go();
	return 0;
}