使用std :: vector.push_back()时出现错误C2280

时间:2017-12-15 16:15:09

标签: c++ vector ofstream

我在执行以下代码时遇到错误“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,每个ifstream / ofstream都有自己的文件进行读/写。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

首先,以下是错误的,因为没有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的{​​{1}},以便os使用&&重载。

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

std::unique_ptr

答案 2 :(得分:1)

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

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