4

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

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

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

4

1 回答 1

4

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

但问题的根源在于,您可能只想要std::future. 您正在复制struct某处,这要求将两个futures 绑定到同一个源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.

于 2013-08-16T13:36:50.670 回答