وقتی با استفاده از Make_shared میخواهید یک فضای حافظه ای از هیپ برای کلاس Child اختصاص بدید، حتما باید سازنده کلاس Child خارج ازحوزه دید کلاس هم قابل دسترس باشد، در غیر اینصورت راهی ندارید که از حافظه هیپ فضایی allocate کنید.به همین علت هست که کامپایلر خطا میدهد که به سازنده کلاس نمی تواند دسترسی داشته باشد. ونکته بعدی اینکه در کد شما ابهام وجود داشت یعنی UpCast ,DownCast رعایت نشده بود که به صورت زیر اصلاح کردم.
#include <iostream>
#include <memory>
using namespace std;
class Foo{
public:
};
class Child;
template<typename BaseClass_>
class Parent
{
public:
static std::shared_ptr<Parent<BaseClass_>> instance_ ;
virtual ~Parent(){}
static std::shared_ptr<Child> getInstance(std::string& path){
if (instance_ == nullptr){
auto upCast = std::make_shared<Child>(path);
instance_ = std::static_pointer_cast<Parent<Foo>>(upCast);
return std::dynamic_pointer_cast<Child>(instance_);
}
return nullptr;
}
protected:
explicit Parent( std::string& path){}
Parent(){};
};
template<typename BaseClass_>
std::shared_ptr<Parent<BaseClass_>> Parent<BaseClass_>::instance_ = nullptr;
class Child : public Parent<Foo>{
public:
using Parent<Foo>::getInstance;
explicit Child( std::string& path):Parent<Foo>(path){}
};
int main() {
std::string path = "test";
auto makeChileShared = Child::getInstance(path);
return 0;
}