【问题标题】:How to pass std::ofstream& into functional params?如何将 std::ofstream& 传递给功能参数?
【发布时间】:2017-08-10 07:50:20
【问题描述】:

这是我的代码

void timer_start(std::function<void(std::ifstream*,std::ofstream&, char*[])> func, unsigned int interval, std::ifstream* ifs, std::ofstream& ofs, char* argv[])
{
    std::thread([func, interval, ifs, ofs, argv]()
    {
        while (true)
        {
            auto x = std::chrono::steady_clock::now() + std::chrono::milliseconds(interval);
            func(ifs, (std::ofstream&)ofs, argv);
            std::this_thread::sleep_until(x);
        }
    }).join();
}

上述代码第二行在传递ofs

时出现如下错误

错误 C2280 'std::basic_ofstream>::basic_ofstream(const std::basic_ofstream> &)':试图引用已删除的函数

为什么会发生这种情况,请帮助我..

【问题讨论】:

标签: c++ c++11


【解决方案1】:

你应该通过引用而不是值来捕获ofs

std::thread([func, interval, ifs, &ofs, argv]()
                                 ^^^^^^
                                  here

并可能删除不必要的演员表:(std::ofstream&amp;)ofs

DEMO

【讨论】:

  • C2661 'std::tuple,std::allocator>,std::basic_ofstream>,void (__cdecl *)(std::thread::id,std::ofstream &)>::tuple': 没有重载函数需要 5 个参数
  • @ArunkumarKathirvel 看到这个错误后我该怎么办?以上修复后的代码使用最新的Visual C++编译器编译成功。
  • 那是我的错误..我从上面的代码块中得到了错误...感谢您尝试..
【解决方案2】:

std::thread([func, interval, ifs, &amp;ofs, argv]() 更改为std::thread([func, interval, ifs, &amp;ofs, argv]()

关于ofstream你可以看here

也许你需要知道关键字 delete and default 在 c++11 中的含义

【讨论】:

    猜你喜欢
    • 2019-11-27
    • 2019-12-27
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    相关资源
    最近更新 更多