【问题标题】:Got error C2280 when using std::vector.push_back()使用 std::vector.push_back() 时出现错误 C2280
【发布时间】:2017-12-15 16:15:09
【问题描述】:

执行以下代码时出现错误“C2280:尝试引用已删除的函数”编译错误:

std::ofstream ofs(m_headerFileName, std::ios::binary, std::ios_base::app);
            m_ofsHeader.push_back(ofs);

在哪里

std::vector<std::ofstream>      m_ofsHeader;

我不明白为什么我不能将 ofstream 实例推送到 ofstream vector。有人给点提示吗?谢谢。我在 Windows 7 和 Visual Studio 2015 上。 另外,如果有的话,这里的周边是什么?

我正在尝试保留一堆 ifstream/ofstream,每个都有自己的文件要读/写。

【问题讨论】:

  • 流不能被复制,流只能有一个实例。
  • 那么解决方法是什么?
  • 您可以使用 c++11 移动流。
  • 这取决于,你为什么要这样做?您想使用此解决方案解决的实际问题是什么?用例是什么?请read about the XY problem 并花一些时间来思考这个问题如何可能是一个问题。
  • 为什么不将指针(或智能指针)放入向量中

标签: c++ vector ofstream


【解决方案1】:

流没有复制构造函数。您可以实现自己的或可能移动的语义。

【讨论】:

  • “你可以实现你自己的” - 你是什么意思?您不能为标准类实现自己的复制构造函数。
  • @ChristianHackl 嗯...从流中驱动并覆盖诸如溢出、下溢等之类的东西...这会很困难但仍然可能(到我回答时还不清楚是什么OP希望因此发生XY问题)
【解决方案2】:

首先,以下是错误的,因为没有带三个参数的std::ofstream构造函数:

std::ofstream ofs(m_headerFileName, std::ios::binary, std::ios_base::app);

你的意思可能是:

std::ofstream ofs(m_headerFileName, std::ios::binary | std::ios::app)

然后,还有存储问题。无法复制流,这就是您的 push_back 失败的原因。

您可以只移动流:

#include <fstream>
#include <vector>
#include <ios>

int main()
{
    std::vector<std::ofstream> streams;

    std::ofstream os("foo.txt", std::ios::binary | std::ios::app);
    streams.push_back(std::move(os));
}

注意std::move,它强制转换os,以便使用push_back&amp;&amp; 重载。

或者您将std::unique_ptrs 存储到向量中的流中:

#include <fstream>
#include <memory>
#include <vector>
#include <ios>

int main()
{
    std::vector<std::unique_ptr<std::ofstream>> streams;

    auto os = std::make_unique<std::ofstream>("foo.txt", std::ios::binary | std::ios::app);
    streams.push_back(std::move(os));
}

【讨论】:

  • 你的答案比我的好很多:)
【解决方案3】:

无法复制流。它们的复制构造函数和复制分配器标记为delete。考虑使用移动语义以及std::vector::emplace_back()

m_ofsHeader.emplace_back(std::move(ofs));
            ^~~~~~~      ^~~~

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 1970-01-01
    • 2010-09-15
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多