#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 T2, typename charT, typename traits >
friend basic_ostream< charT, traits > &
operator<< ( basic_ostream< charT, traits > & out,
const Container< T2 > & a_container ) ;
} ;
template < typename T, typename charT, typename traits >
basic_ostream< charT, traits > &
operator<< ( basic_ostream< charT, traits > & out,
const Container< T > & a_container )
{
static_assert( std:: is_same < T, int > :: value , "Error: T must be an integer" ) ;
out << a_container.value ;
return out;
}
//Main
int main( void )
{
Container< int > my_container( 42 ) ;
Container< bool > other( 100 ) ;
cout << my_container;
cout << other; // ERROR
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy9Gb3J3YXJkIGRlY2xhcmF0aW9ucwp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CmNsYXNzIENvbnRhaW5lcjsKdGVtcGxhdGU8IHR5cGVuYW1lIFQsIHR5cGVuYW1lIGNoYXJULCB0eXBlbmFtZSB0cmFpdHMgPgpiYXNpY19vc3RyZWFtPCBjaGFyVCwgdHJhaXRzID4mIAogICAgb3BlcmF0b3I8PCggYmFzaWNfb3N0cmVhbTwgY2hhclQsIHRyYWl0cyA+JiBvdXQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29udGFpbmVyPCBUID4mIGFfY29udGFpbmVyICk7IAoKLy9EZWZpbml0aW9ucwp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CmNsYXNzIENvbnRhaW5lcgp7CnB1YmxpYzoKICAgIENvbnRhaW5lciggVCBhX3ZhbHVlICk6IHZhbHVlKCBhX3ZhbHVlICl7fQoKcHJpdmF0ZToKICAgIFQgdmFsdWU7CgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBjaGFyVCwgdHlwZW5hbWUgdHJhaXRzID4KICAgIGZyaWVuZCBiYXNpY19vc3RyZWFtPCBjaGFyVCwgdHJhaXRzID4mIAogICAgICAgIG9wZXJhdG9yPDwoIGJhc2ljX29zdHJlYW08IGNoYXJULCB0cmFpdHMgPiYgb3V0LCAKICAgICAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXI8IFQyID4mIGFfY29udGFpbmVyICk7Cn07Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgY2hhclQsIHR5cGVuYW1lIHRyYWl0cyA+CmJhc2ljX29zdHJlYW08IGNoYXJULCB0cmFpdHMgPiYgCiAgICBvcGVyYXRvcjw8KCBiYXNpY19vc3RyZWFtPCBjaGFyVCwgdHJhaXRzID4mIG91dCwgCiAgICAgICAgICAgICAgICBjb25zdCBDb250YWluZXI8IFQgPiYgYV9jb250YWluZXIgKQp7CiAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxULCBpbnQ+Ojp2YWx1ZSwgIkVycm9yOiBUIG11c3QgYmUgYW4gaW50ZWdlciIpOwogICAgb3V0IDw8IGFfY29udGFpbmVyLnZhbHVlOwogICAgcmV0dXJuIG91dDsKfQoKLy9NYWluCmludCBtYWluKCB2b2lkICkKewogICAgQ29udGFpbmVyPCBpbnQgPiBteV9jb250YWluZXIoIDQyICk7CiAgICBDb250YWluZXI8Ym9vbD4gb3RoZXIoMTAwKTsKCiAgICBjb3V0IDw8IG15X2NvbnRhaW5lcjsKICAgIGNvdXQgPDwgb3RoZXI7IC8vIEVSUk9SCgogICAgcmV0dXJuIDA7Cn0=
compilation info
prog.cpp: In instantiation of ‘std::basic_ostream<charT, traits>& operator<<(std::basic_ostream<charT, traits>&, const Container<T>&) [with T = bool; charT = char; traits = std::char_traits<char>]’:
prog.cpp:45:13: required from here
prog.cpp:33:5: error: static assertion failed: Error: T must be an integer
static_assert(std::is_same<T, int>::value, "Error: T must be an integer");
^
stdout