gpt4 book ai didi

c++ - std::unique_ptr 编译器错误:派生类的成员无法访问基类的私有(private)成员

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:06:32 27 4
gpt4 key购买 nike

我得到 Compiler Error C2248当我尝试编译以下代码时:

#include <list>
#include <memory>
using namespace std;


class data
{
public:

static data parse()
{
data d;
data::parse(d);
return d;
}

list<std::unique_ptr<data>> l;

private:

static void parse(data& node)
{ }
};


int main()
{

return 0;
}

为什么?我该如何解决这个问题?

注意:我使用 std::shared_ptr 而不是 std::unique_ptr 没有问题。

最佳答案

您需要为您的类型提供移动操作:

data(data&& other)
: l(std::move(other.l))
{
}

data& operator=(data&& other)
{
l = std::move(other.l);
return *this;
}

并且,由于您已经添加了一个用户声明的构造函数,因此您还需要一个用户声明的默认构造函数:

data() { }

我的理解是,根据最终的 C++11 语言标准,您的代码是正确的。 Visual C++ 没有完全实现关于何时隐式生成移动操作的最终规范(自 Visual C++ 2012 RC 起)。何时生成隐式移动操作的规范在标准化过程的后期发生了多次更改。

如果类类型 C 具有任何可移动但不可复制的数据成员,Visual C++ 将不会生成隐式移动构造函数或移动赋值运算符,以及隐式复制构造函数和复制赋值运算符都被仅移动数据成员的存在所抑制。换句话说,如果您想要聚合仅移动类型,您必须自己为聚合类提供移动操作。

(至少,这是我通过编译器实验得出的理解。)

关于c++ - std::unique_ptr 编译器错误:派生类的成员无法访问基类的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11318302/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com