template <typename T>
struct Foo
{
struct Bar
{
template <typename V>
friend void swap(typename Foo<V>::Bar&, typename Foo<V>::Bar&);
};
};
template <typename T>
void swap(typename Foo<T>::Bar& b1, typename Foo<T>::Bar& b2) { }
template class Foo<int>;
int main()
{
Foo<int>::Bar bb1, bb2;
swap<int>(bb1, bb2);
}
dGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBGb28KewogICAgc3RydWN0IEJhcgogICAgewogICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWPgogICAgICAgIGZyaWVuZCB2b2lkIHN3YXAodHlwZW5hbWUgRm9vPFY+OjpCYXImLCB0eXBlbmFtZSBGb288Vj46OkJhciYpOwogICAgfTsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIHN3YXAodHlwZW5hbWUgRm9vPFQ+OjpCYXImIGIxLCB0eXBlbmFtZSBGb288VD46OkJhciYgYjIpIHsgfQoKdGVtcGxhdGUgY2xhc3MgRm9vPGludD47CgppbnQgbWFpbigpCnsKICAgIEZvbzxpbnQ+OjpCYXIgIGJiMSwgYmIyOwogICAgc3dhcDxpbnQ+KGJiMSwgYmIyKTsKfSA=