#include <iostream>
using namespace std;
//Forward declarations
template< typename T >
class Container;
template< typename T, typename charT, typename traits >
basic_ostream< charT, traits >&
operator<<( basic_ostream< charT, traits >& out,
const Container< T >& a_container );
//Definitions
template< typename T >
class Container
{
public:
Container( T a_value ): value( a_value ){}
private:
T value;
template< typename S, typename charT, typename traits >
friend basic_ostream< charT, traits >&
operator<<( basic_ostream< charT, traits >& out,
const Container< S >& a_container );
};
template< typename T, typename charT, typename traits >
basic_ostream< charT, traits >&
operator<<( basic_ostream< charT, traits >& out,
const Container< T >& a_container )
{
out << a_container.value;
return out;
}
//Main
int main( void )
{
Container< int > my_container( 42 );
cout << my_container;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vRm9yd2FyZCBkZWNsYXJhdGlvbnMKdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgpjbGFzcyBDb250YWluZXI7CnRlbXBsYXRlPCB0eXBlbmFtZSBULCB0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzID4KYmFzaWNfb3N0cmVhbTwgY2hhclQsIHRyYWl0cyA+JiAKICAgIG9wZXJhdG9yPDwoIGJhc2ljX29zdHJlYW08IGNoYXJULCB0cmFpdHMgPiYgb3V0LCAKICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lcjwgVCA+JiBhX2NvbnRhaW5lciApOyAKCi8vRGVmaW5pdGlvbnMKdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgpjbGFzcyBDb250YWluZXIKewpwdWJsaWM6CglDb250YWluZXIoIFQgYV92YWx1ZSApOgl2YWx1ZSggYV92YWx1ZSApe30KCQpwcml2YXRlOgoJVCB2YWx1ZTsKCQoJdGVtcGxhdGU8IHR5cGVuYW1lIFMsIHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMgPgoJZnJpZW5kIGJhc2ljX29zdHJlYW08IGNoYXJULCB0cmFpdHMgPiYgCgkgICAgb3BlcmF0b3I8PCggYmFzaWNfb3N0cmVhbTwgY2hhclQsIHRyYWl0cyA+JiBvdXQsIAoJICAgICAgICAgICAgICAgIGNvbnN0IENvbnRhaW5lcjwgUyA+JiBhX2NvbnRhaW5lciApOwp9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMgPgpiYXNpY19vc3RyZWFtPCBjaGFyVCwgdHJhaXRzID4mIAogICAgb3BlcmF0b3I8PCggYmFzaWNfb3N0cmVhbTwgY2hhclQsIHRyYWl0cyA+JiBvdXQsIAogICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyPCBUID4mIGFfY29udGFpbmVyICkKewoJb3V0IDw8IGFfY29udGFpbmVyLnZhbHVlOwoJcmV0dXJuIG91dDsKfQoKLy9NYWluCmludCBtYWluKCB2b2lkICkKewoJQ29udGFpbmVyPCBpbnQgPiBteV9jb250YWluZXIoIDQyICk7CgkKCWNvdXQgPDwgbXlfY29udGFpbmVyOwoJCglyZXR1cm4gMDsKfQ==