#include <memory>


using namespace std;


class derived_op;


template<class Op>
class base_info :
    enable_shared_from_this<base_info<Op>>
{
public:
    void do_something_spawning_new_ops()
    {
        auto info = 
            enable_shared_from_this<base_info<Op>>::shared_from_this();
    }
};


class derived_info :
    public base_info<derived_op>
{

};


template<class Info>
class base_op
{
public:
    base_op(){}
    base_op(shared_ptr<base_op>){}

    shared_ptr<Info> m_info; 
};


class derived_op :
    public base_op<derived_info>
{
public:
    derived_op(){}
    derived_op(shared_ptr<base_op>){}
};


int main()
{
    derived_op d;
    // Next line fails to compile.
    base_op<base_info> b;

    return 0;
}

