c++ - 错误 C2248: 'std::future<Worldlet>::future':无法访问类 std::future<Worldlet> 中声明的私有(private)成员

标签 c++ c++11 future

当我尝试编译此结构时出现错误 C2248:

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

我尝试将结果作为引用,但随后出现错误 C2512。当我修复该错误时,我会在 xutility 中得到 C2582。有什么方法可以修复第一个错误而不得到后两个错误,或者有什么方法可以同时修复后两个错误?

最佳答案

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

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

std::future旨在将其数据一次传递给一个消费者。所以如果你想移动它,你必须 move它,而不是复制它。

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

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 .

关于c++ - 错误 C2248: 'std::future<Worldlet>::future':无法访问类 std::future<Worldlet> 中声明的私有(private)成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18274138/

相关文章:

c++ - 为什么即使成员函数是 constexpr 也需要 constexpr?

java - ExecutorService Future::变得非常慢

C++11 异步 + 然后

c++ - 圈圈碰撞低资源

c++ - G++ 4.5 错误 : No diagnostic for narrowing in initializer list

c++ - 转置数组时如何有效地使用缓存?

c++ - 有条件地获取 std::mutex

c++ - 光盘库 : michael_deque causes crash when pushing back derived type of custom type (only in release mode)

c++ - std::string 和 QVariant 之间的转换(反之亦然) Qt5

java - 当 ExecutorService 中的任何 Thread/Runnable/Callable 在等待终止时失败时如何捕获异常