我可以将新值分配/移动到元组内的 unique_ptr 中吗?
Posted
技术标签:
【中文标题】我可以将新值分配/移动到元组内的 unique_ptr 中吗?【英文标题】:Can I assign/move a new value into a unique_ptr inside a tuple? 【发布时间】:2016-07-30 12:37:44 【问题描述】:之所以需要这样做,是因为我希望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`
【问题讨论】:
上述方法你试过了吗?出了什么问题? 请提供minimal reproducible example,并附上您遇到的错误。 对不起。现在好点了吗? @snowflake 请注意,此代码甚至与您发布的原始代码都不匹配。 【参考方案1】:仔细查看您遇到的错误,替换类型:
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))
【讨论】:
以上是关于我可以将新值分配/移动到元组内的 unique_ptr 中吗?的主要内容,如果未能解决你的问题,请参考以下文章