c++ - std::shared_ptr 模板因 C2440 而失败

标签 c++ shared-ptr

我想为几个类强制执行 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() {}
};

live example

关于c++ - std::shared_ptr 模板因 C2440 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51499068/

相关文章:

c++ - 多线程老板/ worker 模型的C/C++实现

python - 从 Django 导入 .so 文件

c++ - 缺少 shared_ptr 和 weak_ptr 之间的相等性

c++ - 删除 std::shared_ptr 的条件

c++ - shared_ptr<int> 到数组的元素 (shared_ptr<int[]>)

使用 shared_ptr 的抽象基类的子类的 C++ == 运算符

c++ - 为Vim配置.ccls文件

c++ - C++ 中 operator new[] 的参数值

c++ - 将大型体素数据传输到 GLSL 着色器

C++ 将派生类 shared_ptr 传递给模板函数