#include <iostream>
template<typename T>
class friended1;
template<typename T>
class test1
{
friend class friended1<T>;
void print() const
{
std::cout << "test1" << std::endl;
}
};
template<typename T>
class friended1
{
public:
template<typename U>
static void create()
{
test1<U>().print();
}
};
template<typename T>
class friended2;
template<typename T>
class test2
{
template<typename U>
friend class friended2;
void print() const
{
std::cout << "test2" << std::endl;
}
};
template<typename T>
class friended2
{
public:
template<typename U>
static void create()
{
test2<U>().print();
}
};
int main()
{
friended1<int>::create<int>();
//friended1<int>::create<double>();
friended2<int>::create<int>();
friended2<int>::create<double>();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgZnJpZW5kZWQxOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY2xhc3MgdGVzdDEKewogICBmcmllbmQgY2xhc3MgZnJpZW5kZWQxPFQ+OwogICB2b2lkIHByaW50KCkgY29uc3QKICAgewogICAgICBzdGQ6OmNvdXQgPDwgInRlc3QxIiA8PCBzdGQ6OmVuZGw7CiAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIGZyaWVuZGVkMQp7CnB1YmxpYzoKICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KICAgc3RhdGljIHZvaWQgY3JlYXRlKCkKICAgewogICAgICB0ZXN0MTxVPigpLnByaW50KCk7CiAgIH0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIGZyaWVuZGVkMjsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIHRlc3QyCnsKICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KICAgZnJpZW5kIGNsYXNzIGZyaWVuZGVkMjsKICAgdm9pZCBwcmludCgpIGNvbnN0CiAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJ0ZXN0MiIgPDwgc3RkOjplbmRsOwogICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjbGFzcyBmcmllbmRlZDIKewpwdWJsaWM6CiAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CiAgIHN0YXRpYyB2b2lkIGNyZWF0ZSgpCiAgIHsKICAgICAgdGVzdDI8VT4oKS5wcmludCgpOwogICB9Cn07CgppbnQgbWFpbigpCnsKICAgZnJpZW5kZWQxPGludD46OmNyZWF0ZTxpbnQ+KCk7CiAgIC8vZnJpZW5kZWQxPGludD46OmNyZWF0ZTxkb3VibGU+KCk7CiAgIGZyaWVuZGVkMjxpbnQ+OjpjcmVhdGU8aW50PigpOwogICBmcmllbmRlZDI8aW50Pjo6Y3JlYXRlPGRvdWJsZT4oKTsKfQ==