Given the link to an earlier question as a clarifier, it seems you are asking why T<Derived> is not usually derived from T<Base> .
Consider T = std::shared_ptr .
You do not want this to be possible:
void foo( shared_ptr<Base>& p ) { p.reset( new Derived2 ); } auto main() -> int { shared_ptr<Derived1> p; foo( p );
source share