namespace X
{
namespace Y
{
template <typename R, typename ...T>
R foo(T&&... args)
{
R r(args...);
return r;
}
}
}
class A
{
template <typename R, typename ...T>
friend R X::Y::foo(T&&... args);
A(int x, int y){}
};
int main()
{
X::Y::foo<A>(1, 2);
}
bmFtZXNwYWNlIFgKewogICAgbmFtZXNwYWNlIFkKICAgIHsKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgLi4uVD4KICAgICAgICBSIGZvbyhUJiYuLi4gYXJncykKICAgICAgICB7CiAgICAgICAgICAgIFIgcihhcmdzLi4uKTsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgfQogICAgfQp9CgpjbGFzcyBBCnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSAuLi5UPgogICAgZnJpZW5kIFIgWDo6WTo6Zm9vKFQmJi4uLiBhcmdzKTsKICAgIEEoaW50IHgsIGludCB5KXt9Cn07CgppbnQgbWFpbigpCnsKICAgIFg6Olk6OmZvbzxBPigxLCAyKTsKfQ==