繁体   English   中英

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

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

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

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 ,但是我不知道如何修复第一个参数。

谢谢!

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

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

这里有两个问题:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM