当前位置: 首页 > 知识库问答 >
问题:

错误:无法从“”转换为“std::tuple”

於宾白
2023-03-14

在godbolt.org中编译代码时,我遇到以下错误:

In file included from <source>:5:
/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/thread: In instantiation of 'std::thread::_State_impl<_Callable>::_State_impl(_Args&& ...) [with _Args = {void (Robot::*)(), Robot&}; _Callable = std::thread::_Invoker<std::tuple<void (Robot::*)(), Robot> >]':
/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/thread:226:20:   required from 'static std::thread::_State_ptr std::thread::_S_make_state(_Args&& ...) [with _Callable = std::thread::_Invoker<std::tuple<void (Robot::*)(), Robot> >; _Args = {void (Robot::*)(), Robot&}; std::thread::_State_ptr = std::unique_ptr<std::thread::_State>]'
/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/thread:149:46:   required from 'std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = void (Robot::*)(); _Args = {Robot&}; <template-parameter-1-3> = void]'
<source>:154:51:   required from here
/opt/compiler-explorer/gcc-10.2.0/include/c++/10.2.0/thread:211:46: error: could not convert '{std::forward<void (Robot::*)()>((* & __args#0)), std::forward<Robot&>((* & __args#1))}' from '<brace-enclosed initializer list>' to 'std::tuple<void (Robot::*)(), Robot>'
  211 |    : _M_func{{std::forward<_Args>(__args)...}}
      |                                              ^
      |                                              |
      |                                              <brace-enclosed initializer list>
Compiler returned: 1

看起来该错误是在使用std::thread创建线程时出现的。该守则的简化版本为:

class Robot {

    private:
        vector<double> position;
        double area_covered;
        mutex mtx;

    public:
        Robot(const vector<double> &initial_position) {
            position = initial_position;
            area_covered = 0.0;
        }


        void get_area() {
            // ...
        }
};

int main () {
    vector<vector<double> > path{
      {0.00359, -0.0013},   {0.00608, -0.00281},  {0.00756, -0.0027} };
    Robot r3(path[0]);
    std::thread thread1(&Robot::get_area, r3); // one thread
    thread1.join();
}

共有1个答案

景俊拔
2023-03-14

问题是,像这样将r3传递给线程构造函数会试图复制,而robot是不可复制的,也是不可移动的(因为std::mutex)。

可以通过指针传递对象:

std::thread thread1(&Robot::get_area, &r3);

或从 中使用std::reference_wrapper:

std::thread thread1(&Robot::get_area, std::ref(r3));

联机查看

 类似资料:
  • 问题内容: 在获取json数据时出现错误: JSONArray无法转换为JSONObject JSON生成代码: 在阅读上述json时遇到错误代码有什么问题吗? 问题答案: 更改 至 作为数据值的是JsonArray而不是JSONObject。 为了获取单个ID和字段名称,您应该遍历此JSONArray,如下所示:

  • 下面的代码显示了我要做的:

  • 我是JSON的新手,但我尝试使用所有的答案,但都不起作用。请帮帮我,我做错了什么。 } 我的JSON用于解析。

  • 我会期望std::reference_wrapper在将non-const转换为const方面可以作为参考,例如: 下面的代码在MSVC和GCC中编译并运行良好,但在Clang上则不行。我只是不明白为什么,它是UB,还是实际上是关于Clang编译器的问题? 仅在Clang上,显示以下错误: https://wandbox.org/permlink/FSY4tCvE9B17hbVn

  • 问题内容: 我想填写一个selectonemenu,但总是出现此错误: 这是代码: JSF: 我发现我应该写一个转换器,但是我不知道为什么?因为我已经看到了一些没有转换器的示例工作? 谢谢 问题答案: 在您的网页中尝试此代码 不要将其值属性用于不同目的

  • Docx4j版本2.8.1.3 docx非常简单,只有一些文本,但似乎对任何docx都不适用。 在docx4j论坛上查看源/异常可能更容易。http://www.docx4java.org/forums/pdf-output-f27/docx4j-to-pdf-fop-issues-cannot-perform-the-transformation-t1652.html 如果在一个地方回答,我会用