#include <iostream>
struct Outer
{
template<typename T>
void go()
{
std::cout << Test<T>::f() << std::endl;
}
private:
template<typename T>
struct Test
{
static int f();
};
};
template<> int Outer::Test<int>::f();
template<> int Outer::Test<double>::f();
extern template struct Outer::Test<int>;
extern template struct Outer::Test<double>;
int main()
{
Outer o;
o.go<int>();
o.go<double>();
}
template<>
int Outer::Test<int>::f()
{
return 1;
}
template<>
int Outer::Test<double>::f()
{
return 2;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IE91dGVyCnsKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+Cgl2b2lkIGdvKCkKCXsKCQlzdGQ6OmNvdXQgPDwgVGVzdDxUPjo6ZigpIDw8IHN0ZDo6ZW5kbDsKCX0KcHJpdmF0ZToKCXRlbXBsYXRlPHR5cGVuYW1lIFQ+CglzdHJ1Y3QgVGVzdAoJewoJCXN0YXRpYyBpbnQgZigpOwoJfTsKfTsKCnRlbXBsYXRlPD4gaW50IE91dGVyOjpUZXN0PGludD46OmYoKTsKdGVtcGxhdGU8PiBpbnQgT3V0ZXI6OlRlc3Q8ZG91YmxlPjo6ZigpOwpleHRlcm4gdGVtcGxhdGUgc3RydWN0IE91dGVyOjpUZXN0PGludD47CmV4dGVybiB0ZW1wbGF0ZSBzdHJ1Y3QgT3V0ZXI6OlRlc3Q8ZG91YmxlPjsKCmludCBtYWluKCkKewoJT3V0ZXIgbzsKCW8uZ288aW50PigpOwoJby5nbzxkb3VibGU+KCk7Cn0KCnRlbXBsYXRlPD4KaW50IE91dGVyOjpUZXN0PGludD46OmYoKQp7CglyZXR1cm4gMTsKfQp0ZW1wbGF0ZTw+CmludCBPdXRlcjo6VGVzdDxkb3VibGU+OjpmKCkKewoJcmV0dXJuIDI7Cn0KCg==