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

Got error C2280 when using std::vector.push_back()

本文关键字:错误 C2280 vector std push back 使用      更新时间:2023-10-16

我有错误" 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,每个人都有自己的文件读/写。

首先,以下是错误的,因为没有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的过载。

或您将std::unique_ptr S存储到向量中的流中:

#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));
}

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

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

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