Usando make_shared com um construtor protegido + interface abstrata

Dada uma interface abstrata e uma implementação derivada dessa interface, na qual os construtores são protegidos (a criação desses objetos está disponível apenas em uma fábrica de classes - para implementar um padrão DI), como posso usar o make_shared na função factory?

Por exemplo:

class IInterface
{    
public:    
    virtual void Method() = 0;
};

class InterfaceImpl : public IInterface
{
public:
    virtual void Method() {}

protected:    
    InterfaceImpl() {}    
};

std::shared_ptr<IInterface> Create()
{
    std::shared_ptr<IInterface> object = std:: make_shared<InterfaceImpl>();    
    return object;
}

O make_shared obviamente não pode acessar o construtor protegido no InterfaceImpl ou mesmo no IInterface, dando-me o seguinte erro


error C2248: 'InterfaceImpl::InterfaceImpl' : cannot access protected member declared in class 'InterfaceImpl'

Então, lendo aqui (pergunta:Como tornar o boost :: make_shared um amigo da minha turma), Tentei colocar o seguinte na classe de implementação:


friend std::shared_ptr<InterfaceImpl> std::make_shared<InterfaceImpl>();

Ainda não seria compilado. Então, eu coloquei outro na classe IInterface também. Ainda sem alegria. O que eu fiz de errado aqui?

EDIT: arquivo de origem completo usado para compilar, com "amigo" ...

#include <memory>

class IInterface
{    
public:    
    friend std::shared_ptr&lt;IInterface> Create();     
    virtual void Method() = 0;
};

class InterfaceImpl : public IInterface
{    
public:     
    virtual void Method() {}

protected:    
    friend std::shared_ptr&lt;IInterface> Create();     
    InterfaceImpl() {}    
};

std::shared_ptr<IInterface> Create()
{
    std::shared_ptr<IInterface> object = std::make_shared<InterfaceImpl>();    
    return object;
}

void main()
{
    std::shared_ptr<IInterface> i = Create();   
}

questionAnswers(2)

yourAnswerToTheQuestion