【问题标题】:Threading in C++ : cannot convert argument 1 from 'const std::ofstream' to 'std::ofstream &'C++ 中的线程:无法将参数 1 从 'const std::ofstream' 转换为 'std::ofstream &'
【发布时间】:2017-11-28 00:07:04
【问题描述】:

我有一个在线程上写入文件的类

class A{
public:    
void writeToFile(ofstream& outFile, obj &a)
    {
        //...
    }
    thread memberThread1(ofstream& outFile, obj &a)
    {
        cout << "Thread 1 is now running " << endl;
        return thread ([=]{ writeToFile(outFile, a);});
    }
};

我在 lambda 函数上遇到了一些错误。

无法将参数 1 从“const std::ofstream”转换为“std::ofstream” &'

注意:转换失去限定符

我能够通过执行const_cast 来修复第二个参数a,但我不知道如何修复第一个参数。

谢谢!

【问题讨论】:

标签: c++ multithreading lambda


【解决方案1】:

问题是您的 lambda 捕获是按值进行的,这对于 outFile 是不可能的。尝试通过引用捕获:

   return thread ([&]{ writeToFile(outFile, a);});

【讨论】:

    【解决方案2】:

    这里有两个问题:

    • 按值捕获时,captured objects default to const,尽管您可以更改此设置,如该问题的顶部答案所示。

    • 按值捕获会复制对象,但ofstream 是不可复制的。因此,即使您修复了第一个问题,您也会收到关于第二个问题的新错误消息。

    正如其他答案所述,您可以通过引用来捕获。但是,您需要注意确保在线程完成之前不会破坏原始对象;并且在启动的线程和其他线程之间没有竞争条件(并发不受保护的访问)。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      • 2020-02-26
      • 2010-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多