#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKc3RydWN0IEZpcnN0IHsKCXRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJdXNpbmcgQXJyYXlUeXBlID0gc3RkOjp2ZWN0b3I8VD47Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4Kc3RydWN0IFNlY29uZCB7Cgl2b2lkIGdvKCkgeyBzdGQ6OmNvdXQgPDwgIkdlbmVyYWxcbiI7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgU2Vjb25kIDwgdHlwZW5hbWUgRmlyc3Q6OnRlbXBsYXRlIEFycmF5VHlwZTxUPiA+IHsKCXZvaWQgZ28oKSB7IHN0ZDo6Y291dCA8PCAiU3BlY2lhbGl6ZWRcbiI7IH0KfTsKCmludCBtYWluKCkgewoJU2Vjb25kIDwgc3RkOjp2ZWN0b3I8aW50PiA+IHNlY29uZDsKCXNlY29uZC5nbygpOwoJcmV0dXJuIDA7Cn0=