Использование make_shared с защищенным конструктором + абстрактный интерфейс

Учитывая абстрактный интерфейс и реализацию, производную от этого интерфейса, где конструкторы защищены (создание этих объектов доступно только из фабрики классов - для реализации шаблона DI), как я могу использовать make_shared в функции фабрики?

Например:

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

make_shared, очевидно, не может получить доступ к защищенному конструктору в InterfaceImpl или даже в IInterface, что выдает мне следующую ошибку


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

Так что читайте здесь (вопрос:Как сделать буст :: make_shared друг моего класса), Я попытался поместить следующее в класс реализации:


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

Это все еще не скомпилируется. Тогда я добавлю еще один в класс IInterface. Все еще нет радости. Что я здесь не так сделал?

РЕДАКТИРОВАТЬ: полный исходный файл, используемый для компиляции, с "другом" ...

#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();   
}

Ответы на вопрос(2)

Ваш ответ на вопрос