错误C2248:'std :: future <worldlet> :: future':无法访问类std :: future <worldlet> </worldlet> </worldlet>中声明的私有成员

时间:2013-08-16 13:11:17

标签: c++ c++11 future

当我尝试编译这个结构时,我收到错误C2248:

struct LoadingWorldlet {
    int x, z;
    std::future<Worldlet> result;
};

我试图将结果作为引用,但后来我得到错误C2512。当我修复那个错误时,我得到了C2582的xutility。有什么方法可以解决这个第一个错误,而不会得到第二个错误,或者什么方法可以解决后两个错误?

1 个答案:

答案 0 :(得分:4)

std::future<Worldlet>替换为std::shared_future<Worldlet>可能会解决您的即时编译问题。

但问题的根源在于,您可能只想要std::future的一个消费者。您正在复制struct某处,这要求将两个future绑定到同一来源promise(或任何来源)。

std::future旨在向一位消费者提供一次数据。因此,如果你想要移动它,你必须move它,而不是复制它。

根据您的错误猜测,您正在编译MSVC2012。此编译器缺少自动移动构造函数和赋值构造函数创建。因此,请尝试添加显式移动构造函数和move-assign方法。

struct LoadingWorldlet {
  int x, z;
  std::future<Worldlet> result;
  LoadingWorldlet(LoadingWorldlet&& o):x(o.x),y(o.y),result(std::move(o.result)) {}
  LoadingWorldlet& operator=(LoadingWorldlet&& o) {
    x = o.x;
    y = o.y;
    result = std::move(o.result);
    return *this;
  }
};

然后,避免隐式复制LoadingWorldlet