我可以将新值分配/移动到元组内的unique_ptr吗?

时间:2016-07-30 12:37:45

标签: c++ c++11 tuples unique-ptr

由于我希望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`

1 个答案:

答案 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_ptrcondition_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))