C++线程:无法将参数 1 从 'const std::ofstream' 转换为 'std::ofstream &'

Threading in C++ : cannot convert argument 1 from 'const std::ofstream' to 'std::ofstream &'

本文关键字:std ofstream 转换 const 线程 参数 C++      更新时间:2023-10-16

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

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 &amp;'

注意:转换失去限定词

我能够通过执行const_cast来修复第二个参数a,但我无法弄清楚如何修复第一个参数。

谢谢!

问题是您的lambda捕获是按价值捕获的,对于外档来说是不可能的。尝试通过参考捕获:

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

这里有2个问题:

  • 按值捕获时,捕获的对象默认为 const,尽管您可以按照该问题的最高答案所示。

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

如其他答案所述,您可以通过参考捕获。但是,您需要谨慎地确保在螺纹完成之前不会破坏原始对象;而且,在启动线程和其他线程之间没有种族条件(同时不受保护的访问)。