我正在使用ncurses
实现我的餐饮哲学家问题版本,并遇到了初始化Fork
对象的向量的问题。
#include <vector>
#include <mutex>
#include <ncurses.h>
...
struct Fork
{
Fork(WINDOW *fork_window) : fork_window(fork_window) {}
std::mutex m;
WINDOW *fork_window;
};
std::vector<WINDOW *> fork_windows; // properly populated later
std::vector<Fork> forks;
...
for (int i = 0; i < num_of_phils; i++)
{
forks.emplace_back(Fork(fork_windows[i]));
}
我想知道我的错误是什么(我没有现代C ++的经验)。是Fork
中的初始化程序列表错误,还是std::mutex
成员导致了问题?我以类似的方式成功地填充了另一个向量,但是另一个结构没有std::mutex
成员,只有WINDOW *
和三个ints
。
终端中的错误很长,并说:
error: use of deleted function ‘Fork::Fork(Fork&&)’,
...
note: ‘Fork::Fork(Fork&&)’ is implicitly deleted because the default definition would be ill-formed:
这是我第一次看到这样的错误,并且由于没有在任何地方找到类似的情况而对其进行谷歌搜索也没有帮助。
就目前情况而言,您无法拥有std::vector<Fork>
,因为std::mutex
既不可复制也不可移动,并且这会隐式删除Fork
的copy和move构造函数。
考虑使用std::vector<std::unique_ptr<Fork>>
,而不是这样:
#include <vector>
#include <mutex>
#include <memory>
#include <ncurses.h>
...
struct Fork
{
Fork(WINDOW *fork_window) : fork_window(fork_window) {}
std::mutex m;
WINDOW *fork_window;
};
std::vector<WINDOW *> fork_windows; // properly populated later
std::vector<std::unique_ptr <Fork>> forks;
...
for (int i = 0; i < num_of_phils; i++)
{
forks.emplace_back(new Fork(fork_windows[i]));
}
如果您愿意,可以替换:
forks.emplace_back (new Fork (fork_windows [i]));
with:
forks.push_back (std::make_unique <Fork> (fork_windows [i]));
在很大程度上取决于样式。
编辑:
修复代码的另一种方法是像这样声明Fork
:
struct Fork
{
Fork(WINDOW *fork_window) : fork_window(fork_window) {}
std::unique_ptr <std::mutex> m = std::make_unique <std::mutex> ();
WINDOW *fork_window;
};
现在Fork
可移动(但不可复制)。