#include <iostream>
using namespace std;
template<typename T>
struct SharedPtr
{
SharedPtr() {}
template <class U>
SharedPtr(const SharedPtr<U>& value);
T *_value;
};
template<typename T>
template<typename U>
SharedPtr<T>::SharedPtr(const SharedPtr<U> &value)
: _value(value._value)
{ }
struct Base {};
struct Derived : Base {};
int main() {
SharedPtr<Derived> dS;
SharedPtr<Base> dB(dS);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IFNoYXJlZFB0cgp7CglTaGFyZWRQdHIoKSB7fQoJCiAgICB0ZW1wbGF0ZSA8Y2xhc3MgVT4gCiAgICBTaGFyZWRQdHIoY29uc3QgU2hhcmVkUHRyPFU+JiB2YWx1ZSk7CiAgICAKICAgIFQgKl92YWx1ZTsKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnRlbXBsYXRlPHR5cGVuYW1lIFU+ClNoYXJlZFB0cjxUPjo6U2hhcmVkUHRyKGNvbnN0IFNoYXJlZFB0cjxVPiAmdmFsdWUpCiA6IF92YWx1ZSh2YWx1ZS5fdmFsdWUpCnsgfQoKc3RydWN0IEJhc2Uge307CnN0cnVjdCBEZXJpdmVkIDogQmFzZSB7fTsKCmludCBtYWluKCkgewoJCglTaGFyZWRQdHI8RGVyaXZlZD4gZFM7CglTaGFyZWRQdHI8QmFzZT4gZEIoZFMpOwoJCglyZXR1cm4gMDsKfQ==