#include <cstdio>
typedef unsigned short wchar;
template<class T>
class Test
{
public:
template<class T2>
Test(const T2* sz)
{
printf ("common version\n");
}
void foo()
{
printf("foo\n");
}
protected:
};
template<>
template<>
Test<char>::Test<wchar>(const wchar* sz)
{
printf ("a.w. str: %p\n", sz);
}
template<>
template<>
Test<wchar>::Test<char>(const char* sz)
{
printf ("w.a. str: %p\n", sz);
}
int main()
{
wchar a = 3;
char b = '0';
Test<char> t1(&a);
Test<char> t2(&b);
Test<wchar> t3(&a);
Test<wchar> t4(&b);
t1.foo();
t2.foo();
t3.foo();
t4.foo();
return 0;
}
I2luY2x1ZGUgPGNzdGRpbz4KCnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgd2NoYXI7Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBUZXN0CnsKcHVibGljOgogICAgdGVtcGxhdGU8Y2xhc3MgVDI+CiAgICBUZXN0KGNvbnN0IFQyKiBzeikKICAgIHsKICAgICAgICBwcmludGYgKCJjb21tb24gdmVyc2lvblxuIik7CiAgICB9CgogICAgdm9pZCBmb28oKQogICAgewogICAgICAgIHByaW50ZigiZm9vXG4iKTsKICAgIH0KcHJvdGVjdGVkOgp9OwoKdGVtcGxhdGU8Pgp0ZW1wbGF0ZTw+ClRlc3Q8Y2hhcj46OlRlc3Q8d2NoYXI+KGNvbnN0IHdjaGFyKiBzeikKewogICAgcHJpbnRmICgiYS53LiBzdHI6ICVwXG4iLCBzeik7Cn0KCnRlbXBsYXRlPD4KdGVtcGxhdGU8PgpUZXN0PHdjaGFyPjo6VGVzdDxjaGFyPihjb25zdCBjaGFyKiBzeikKewogICAgcHJpbnRmICgidy5hLiBzdHI6ICVwXG4iLCBzeik7Cn0KCgppbnQgbWFpbigpCnsKCiAgICB3Y2hhciBhID0gMzsKICAgIGNoYXIgYiA9ICcwJzsKCiAgICBUZXN0PGNoYXI+IHQxKCZhKTsKICAgIFRlc3Q8Y2hhcj4gdDIoJmIpOwogICAgVGVzdDx3Y2hhcj4gdDMoJmEpOwogICAgVGVzdDx3Y2hhcj4gdDQoJmIpOwoKICAgIHQxLmZvbygpOwogICAgdDIuZm9vKCk7CiAgICB0My5mb28oKTsKICAgIHQ0LmZvbygpOwogICAgcmV0dXJuIDA7Cn0=