我想为几个类强制执行 shared_ptr
。我正在使用 static
工厂函数来封装私有(private)构造函数:
#include <memory>
class MyClass
{
public:
static std::shared_ptr<MyClass> create() {
auto a = std::shared_ptr<MyClass>(new MyClass());
return a;
}
private:
MyClass();
~MyClass();
}
}
此模板失败并返回 C2440
,(函数式转换)在 VS2017
中,但在 VS2015
中运行良好,我不知道为什么。 make_shared-version 在两者中都可以正常工作,但需要公共(public)构造函数。
知道我错过了哪个选项吗?
最佳答案
看起来 VS2017 提示从 std::shared_ptr
访问析构函数,因此您可能希望将 std::shared_ptr
声明为 MyClass 的友元。对于 std::make_shared
,您可以使用此答案中的技巧 How do I call ::std::make_shared on a class with only protected or private constructors?
class MyClass
{
public:
static std::shared_ptr<MyClass> create() {
struct make_shared_enabler : MyClass {};
return std::make_shared<make_shared_enabler>();
}
// compiles fine for gcc without friend though
//friend class std::shared_ptr<MyClass>;
private:
MyClass() {}
~MyClass() {}
};
关于c++ - std::shared_ptr 模板因 C2440 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51499068/