#include <iostream>
#include <vector>

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

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

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

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