由于我希望run
使用所有其他元组元素,因此需要这样做。基本上,我有一个这些元组的向量来形成一种表格。我无法弄清楚自己如何正确地做到这一点。
编辑:显然,之前的简化代码会产生不同的错误,因此请忽略它。这段代码就是我在代码中的代码。 (对不起)
class GUI {
using win_t = std::tuple<sf::RenderWindow&, Container&, std::unique_ptr<std::thread>, std::condition_variable>;
enum { WINDOW, CONT, THREAD, CV }
std::vector<win_t> windows;
void run(win_t &win);
win_t &addWindow(sf::RenderWindow & window, Container & c) {
windows.emplace_back(std::forward_as_tuple(window, c, nullptr, std::condition_variable()));
win_t &entry = windows.back();
std::get<GUI::THREAD>(entry) = std::make_unique<std::thread>(&GUI::run, this, entry); // error is on this line
return entry;
}
}
错误我得到了:
Error C2280 'std::tuple<sf::RenderWindow &,Container &,std::unique_ptr<std::thread,std::default_delete<_Ty>>,std::condition_variable>::tuple(const std::tuple<sf::RenderWindow &,Container &,std::unique_ptr<_Ty,std::default_delete<_Ty>>,std::condition_variable> &)': attempting to reference a deleted function dpomodorivs c:\program files (x86)\microsoft visual studio 14.0\vc\include\tuple 75`
答案 0 :(得分:2)
仔细查看您获得的错误,替换出类型:
Error C2280 'std::tuple<Ts...>::tuple(const std::tuple<Ts...>&)': attempting to reference a deleted function dpomodorivs c:\program files (x86)\microsoft visual studio 14.0\vc\include\tuple 75`
您正在尝试在元组上使用复制构造函数,这是不可复制的(由于unique_ptr
和condition_variable
)。在那一行,这就发生在这里:
std::make_unique<std::thread>(&GUI::run, this, entry)
或者更具体地说,在底层的std::thread
构造函数调用中。 entry
不可复制,但thread
构造函数在内部复制其所有参数。即使entry
是可复制的,也不希望您想要,因为run()
将会引用thread
的副本而不是{您想要的具体entry
。
为此,您需要std::ref()
:
std::make_unique<std::thread>(&GUI::run, this, std::ref(entry))