Usando make_shared con un constructor protegido + interfaz abstracta

Dada una interfaz abstracta y una implementación derivada de esa interfaz, donde los constructores están protegidos (la creación de estos objetos solo está disponible desde una fábrica de clases, para implementar un patrón DI), ¿cómo puedo usar make_shared en la función de fábrica?

Por ejemplo:

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;
}

obviamente, make_shared no puede acceder al constructor protegido en InterfaceImpl, o de hecho en IInterface, dándome el siguiente error


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

Entonces leyendo aquí (pregunta:Cómo hacer boost :: make_shared un amigo de mi clase), Intenté poner lo siguiente en la clase de implementación:


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

Todavía no se compilaría. Entonces puse otro en la clase IInterface también. Aún no hay alegría. ¿Qué he hecho mal aquí?

EDITAR: archivo fuente completo utilizado para compilar, con "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();   
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta