#include <iostream>
template < typename T1, T1 value>
class Class1
{
public :
template < typename T2>
class Class2
{
public :
explicit Class2(
T2 theValue
) : myValue( theValue)
{
return ;
}
template < typename T1Other, T1Other valueOther, typename T2Other>
inline Class2(
typename Class1< T1Other, valueOther> :: template Class2< T2Other> const & other
) {
myValue = other.myValue ;
}
template < typename T1Other, T1Other valueOther, typename T2Other>
inline bool operator== (
typename Class1< T1Other, valueOther> :: template Class2< T2Other> const & other
) const {
return ( myValue == other.myValue ) ;
}
private :
T2 myValue;
} ;
Class2< T1> const get( ) const
{
return Class2< T1> ( value) ;
}
} ;
int main( int argc, char * argv[ ] )
{
Class1< int , 1 > c1;
Class1< int , 2 > c2;
std:: cout << ( c1.get ( ) == c2.get ( ) ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgVDEgdmFsdWU+CmNsYXNzIENsYXNzMQp7CnB1YmxpYzoKICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDI+CiAgICAgICAgY2xhc3MgQ2xhc3MyCiAgICAgICAgewogICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIGV4cGxpY2l0IENsYXNzMigKICAgICAgICAgICAgICAgICAgICAgICAgVDIgdGhlVmFsdWUKICAgICAgICAgICAgICAgICkgOiBteVZhbHVlKHRoZVZhbHVlKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMU90aGVyLCBUMU90aGVyIHZhbHVlT3RoZXIsIHR5cGVuYW1lIFQyT3RoZXI+CiAgICAgICAgICAgICAgICBpbmxpbmUgQ2xhc3MyKAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDbGFzczE8VDFPdGhlciwgdmFsdWVPdGhlcj46OnRlbXBsYXRlIENsYXNzMjxUMk90aGVyPiBjb25zdCAmIG90aGVyCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXlWYWx1ZSA9IG90aGVyLm15VmFsdWU7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMU90aGVyLCBUMU90aGVyIHZhbHVlT3RoZXIsIHR5cGVuYW1lIFQyT3RoZXI+CiAgICAgICAgICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KAogICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBDbGFzczE8VDFPdGhlciwgdmFsdWVPdGhlcj46OnRlbXBsYXRlIENsYXNzMjxUMk90aGVyPiBjb25zdCAmIG90aGVyCiAgICAgICAgICAgICAgICApIGNvbnN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChteVZhbHVlID09IG90aGVyLm15VmFsdWUpOwogICAgICAgICAgICAgICAgfQogCiAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIFQyIG15VmFsdWU7CiAgICAgICAgfTsKIAogICAgICAgIENsYXNzMjxUMT4gY29uc3QgZ2V0KCkgY29uc3QKICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MyPFQxPih2YWx1ZSk7CiAgICAgICAgfQp9OwogCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKQp7CiAgICAgICAgQ2xhc3MxPGludCwgMT4gYzE7CiAgICAgICAgQ2xhc3MxPGludCwgMj4gYzI7CiAKICAgICAgICBzdGQ6OmNvdXQgPDwgKGMxLmdldCgpID09IGMyLmdldCgpKTsKfQ==
compilation info
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:47: error: no match for ‘operator==’ in ‘c1.Class1<T1, value>::get [with T1 = int, T1 value = 1]() == c2.Class1<T1, value>::get [with T1 = int, T1 value = 2]()’
stdout