#include <iostream>
template<typename T> class Foo;
template <typename T>
std::ostream& operator<< (std::ostream& o, const Foo<T>& x);
template<typename T>
class Foo {
public:
Foo(T const& value = T());
friend std::ostream& operator<< <> (std::ostream& o, const Foo<T>& x);
//friend std::ostream& ::operator<< (std::ostream& o, const Foo<T>& x);
private:
T value_;
};
template<typename T>
Foo<T>::Foo(T const& value )
: value_(value)
{ }
template<typename T>
std::ostream& operator<< (std::ostream& o, const Foo<T>& x)
{ return o << x.value_; }
int main()
{
Foo<int> rhs(2);
std::cout << rhs;
}
ICNpbmNsdWRlIDxpb3N0cmVhbT4KIAp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBGb287CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgbywgY29uc3QgRm9vPFQ+JiB4KTsKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIGNsYXNzIEZvbyB7CiBwdWJsaWM6CiAgIEZvbyhUIGNvbnN0JiB2YWx1ZSA9IFQoKSk7CiAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPD4gKHN0ZDo6b3N0cmVhbSYgbywgY29uc3QgRm9vPFQ+JiB4KTsKICAgLy9mcmllbmQgc3RkOjpvc3RyZWFtJiA6Om9wZXJhdG9yPDwgKHN0ZDo6b3N0cmVhbSYgbywgY29uc3QgRm9vPFQ+JiB4KTsKIHByaXZhdGU6CiAgIFQgdmFsdWVfOwogfTsgCiAKICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogRm9vPFQ+OjpGb28oVCBjb25zdCYgdmFsdWUgKQogICA6IHZhbHVlXyh2YWx1ZSkKIHsgfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8IChzdGQ6Om9zdHJlYW0mIG8sIGNvbnN0IEZvbzxUPiYgeCkKIHsgcmV0dXJuIG8gPDwgeC52YWx1ZV87IH0gCiAKIGludCBtYWluKCkKIHsKICAgRm9vPGludD4gcmhzKDIpOwogICBzdGQ6OmNvdXQgPDwgcmhzOwogfSA=