struct B { } ;
struct D : B { } ;
template < typename T>
class MyPtr
{
public :
MyPtr( T* t) : t( t) { }
template < typename U>
MyPtr( U* ) = delete ;
MyPtr operator = ( T* t) { this- > t = t; }
template < typename U>
MyPtr operator = ( U* t) = delete ;
operator T* ( ) const { return t; }
private :
T* t;
} ;
int main( )
{
D d;
B* bd = & d;
MyPtr< B> pd = & d;
MyPtr< B> n = nullptr;
}
c3RydWN0IEIge307CnN0cnVjdCBEIDogQiB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIE15UHRyCnsKcHVibGljOgogICAgTXlQdHIoVCogdCkgOiB0KHQpIHt9CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CiAgICBNeVB0cihVKikgPSBkZWxldGU7CgogICAgTXlQdHIgb3BlcmF0b3IgPSAoVCogdCkgeyB0aGlzLT50ID0gdDsgfQoKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgogICAgTXlQdHIgb3BlcmF0b3IgPSAoVSogdCkgPSBkZWxldGU7CgogICAgb3BlcmF0b3IgVCogKCkgY29uc3QgeyByZXR1cm4gdDsgfQoKcHJpdmF0ZToKICAgIFQqIHQ7Cn07CgppbnQgbWFpbigpCnsKICAgIEQgZDsKICAgIEIqIGJkID0gJmQ7CiAgICBNeVB0cjxCPiBwZCA9ICZkOwogICAgTXlQdHI8Qj4gbiA9IG51bGxwdHI7Cn0K