std::vector<std::ofstream>::erase 给出编译错误
std::vector<std::ofstream>::erase is giving compile error
嗨,我正在尝试进行一些文件操作,如果需要,用户可以打开多个文件。我已经创建了一个向量派生的ofstream
,但当我想用std::vector<Type>::erase(std::vector<Type>::iterator)
编译器擦除I时,元素(哪个文件已经关闭)会给我错误,但我有另一个向量衍生的std::string
,我正在以同样的方式擦除它,它不会给我错误。我的代码是;
#include <iostream>
#include <fstream>
#include <vector>
std::vector<std::ofstream> of;
std::vector<std::string> sv;
int CloseFile(int id, file_t ft) {
std::vector<std::ofstream>::iterator i;
std::vector<std::string>::iterator j;
if (of[id].is_open() == true) {
of[id].close();
i = of.begin() + id;
j = sv.begin() + id;
of.erase(i); // showing error for this line
sv.erase(j);
}
}
我在Ubuntu 12.04上使用Nsight Eclipse Edition 6.0,无论如何我都需要打开一个或多个文件,Eclipse输出的问题部分的错误是;
- 从'_OI std::__copy_move_a(_II,_II,_OI)[其中bool _IsMove=false;_II=std::basic_ofstream;_OI=std::basic_offstream]需要
- 从'_OI std::__copy_move_a2(_II,_II,_OI)需要[其中bool _IsMove=false;_II=__gnucxx::__normal_iterator*,std::vector>>;_OI=__GNucxx::__normal_idterator*;std::vector>>]
- 必需自'_OI std::copy(_II,_II,_OI)[其中_II=__gnu_cxx::__normal_iterator*,std::vector>>;_OI=__gnu_cxx:__normal_idterator*;std::vector>>]
- 必需自'_OI std::copy(_II,_II,_OI)[其中_II=__gnu_cxx::__normal_iterator*,std::vector>>;_OI=__gnu_cxx:__normal_idterator*;std::vector>>]
- std::basic_streambuf<_CharT,_Traits>&std::basic_streambuf<_CharT,_Traits>::运算符=(const std::basic_streambuf<_CharT,_Taits>&)[其中_CharT=char;_Traits=std::char_Traits]
- std::ios_base&std::ios_base::operator=(const std::ios base&)
- make:***[dosya/dosya.o]错误1
- 在此内容中
- 在此内容中
- 从这里开始需要
指示代码行的最后一个错误
编译器输出:(有些单词是土耳其语,dosya=file,GeriDonus_t=Return_t,DosyaKapat=FileClose)
16:06:56 **** Incremental Build of configuration Debug for project deneme ****`
make all`
Building file: ../dosya/dosya.cpp`
Invoking: NVCC Compiler`
/usr/local/cuda-6.0/bin/nvcc -I"/usr/local/cuda-6.0/samples/3_Imaging" -I"/usr/local /cuda-6.0/samples/common/inc" -I"/opt/Calismalar/Cuda/cuda-workspace/deneme" -I/usr/local/opencv/include -I/usr/local/opencv/include/opencv -I/opt/Calismalar/Cuda/cuda-workspace/deneme/ -G -g -O0 -gencode arch=compute_30,code=sm_30 -gencode arch=compute_32,code=sm_32 -odir "dosya" -M -o "dosya/dosya.d" "../dosya/dosya.cpp"`
nvcc warning : The 'compute_10' and 'sm_10' architectures are deprecated, and may be removed in a future release.`
/usr/local/cuda-6.0/bin/nvcc -I"/usr/local/cuda-6.0/samples/3_Imaging" -I"/usr/local/cuda-6.0/samples/common/inc" -I"/opt/Calismalar/Cuda/cuda-workspace/deneme" -I/usr/local/opencv/include -I/usr/local/opencv/include/opencv -I/opt/Calismalar/Cuda/cuda-workspace/deneme/ -G -g -O0 --compile -x c++ -o "dosya/dosya.o" "../dosya/dosya.cpp"
In file included from /usr/include/c++/4.8/ios:42:0,
from /usr/include/c++/4.8/ostream:38,
from /usr/include/c++/4.8/iostream:39,
from ../dosya/dosya.h:13,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/bits/basic_ios.h: In instantiation of ‘static _OI std::__copy_move<false, false, std::random_access_iterator_tag>::__copy_m(_II, _II, _OI) [with _II = std::basic_ofstream<char>*; _OI = std::basic_ofstream<char>*]’:
/usr/include/c++/4.8/bits/stl_algobase.h:390:70: required from ‘_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = false; _II = std::basic_ofstream<char>*; _OI = std::basic_ofstream<char>*]’
/usr/include/c++/4.8/bits/stl_algobase.h:428:38: required from ‘_OI std::__copy_move_a2(_II, _II, _OI) [with bool _IsMove = false; _II = __gnu_cxx::__normal_iterator<std::basic_ofstream<char>*, std::vector<std::basic_ofstream<char> > >; _OI = __gnu_cxx::__normal_iterator<std::basic_ofstream<char>*, std::vector<std::basic_ofstream<char> > >]’
/usr/include/c++/4.8/bits/stl_algobase.h:460:17: required from ‘_OI std::copy(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator<std::basic_ofstream<char>*, std::vector<std::basic_ofstream<char> > >; _OI = __gnu_cxx::__normal_iterator<std::basic_ofstream<char>*, std::vector<std::basic_ofstream<char> > >]’
/usr/include/c++/4.8/bits/vector.tcc:138:2: required from ‘std::vector<_Tp, _Alloc>::iterator std::vector<_Tp, _Alloc>::erase(std::vector<_Tp, _Alloc>::iterator) [with _Tp = std::basic_ofstream<char>; _Alloc = std::allocator<std::basic_ofstream<char> >; std::vector<_Tp, _Alloc>::iterator = __gnu_cxx::__normal_iterator<std::basic_ofstream<char>*, std::vector<std::basic_ofstream<char> > >; typename std::_Vector_base<_Tp, _Alloc>::pointer = std::basic_ofstream<char>*]’
../dosya/dosya.cpp:152:27: required from here
/usr/include/c++/4.8/bits/ios_base.h:789:5: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private
operator=(const ios_base&);
^
In file included from /usr/include/c++/4.8/ios:44:0,
from /usr/include/c++/4.8/ostream:38,
from /usr/include/c++/4.8/iostream:39,
from ../dosya/dosya.h:13,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/bits/basic_ios.h:66:11: error: within this context
class basic_ios : public ios_base
^
In file included from /usr/include/c++/4.8/iostream:39:0,
from ../dosya/dosya.h:13,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/ostream:58:11: note: synthesized method ‘std::basic_ios<char>& std::basic_ios<char>::operator=(const std::basic_ios<char>&)’ first required here
class basic_ostream : virtual public basic_ios<_CharT, _Traits>
^
In file included from ../dosya/dosya.h:14:0,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/fstream:599:11: note: synthesized method ‘std::basic_ostream<char>& std::basic_ostream<char>::operator=(const std::basic_ostream<char>&)’ first required here
class basic_ofstream : public basic_ostream<_CharT,_Traits>
^
In file included from /usr/include/c++/4.8/ios:43:0,
from /usr/include/c++/4.8/ostream:38,
from /usr/include/c++/4.8/iostream:39,
from ../dosya/dosya.h:13,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/streambuf:810:7: error: ‘std::basic_streambuf<_CharT, _Traits>& std::basic_streambuf<_CharT, _Traits>::operator=(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char; _Traits = std::char_traits<char>]’ is private
operator=(const basic_streambuf&) { return *this; };
^
In file included from ../dosya/dosya.h:14:0,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/fstream:72:11: error: within this context
class basic_filebuf : public basic_streambuf<_CharT, _Traits>
^
/usr/include/c++/4.8/fstream:599:11: note: synthesized method ‘std::basic_filebuf<char>& >std::basic_filebuf<char>::operator=(const std::basic_filebuf<char>&)’ first required here
class basic_ofstream : public basic_ostream<_CharT,_Traits>
^
In file included from /usr/include/c++/4.8/bits/char_traits.h:39:0,
from /usr/include/c++/4.8/ios:40,
from /usr/include/c++/4.8/ostream:38,
from /usr/include/c++/4.8/iostream:39,
from ../dosya/dosya.h:13,
from ../dosya/dosya.cpp:9:
/usr/include/c++/4.8/bits/stl_algobase.h:335:18: note: synthesized method ‘std::basic_ofstream<char>& std::basic_ofstream<char>::operator=(const std::basic_ofstream<char>&)’ first required here
*__result = *__first;
^
make: *** [dosya/dosya.o] Error 1
16:06:57 Build Finished (took 456ms)`
我对此一无所知。我还看了这个,这个,这个(这是关于eclipse错误的),FAQ-q7.1,这个(关于List,但error是相同的,说error实际上不是error,我没有更改编译器(nvcc))。谢谢大家。
std::vector将其元素保持在连续的内存块中,没有间隙。若要擦除某个图元,则会将后面的所有图元移动或复制到新位置。在这种情况下,流的std::无法移动,因此它在编译错误中运行。
不要在std::向量中直接使用std::of流。它适用于引用、指针或-i preferre-std::unique_ptr。
它也适用于std::list而不是vector。std::list有另一种保存元素的方式,它不会移动它们。但我不确定这是否比std:vector中的reference/pinter/std_unique_ptr更好。
我已经更改了代码,现在它没有错误。感谢大家。
现在是:
#include <iostream>
#include <fstream>
#include <string>
#include <stdlib.h>
std::vector<std::ofstream*> of;
std::vector<std::string> sv;
int CloseFile(int id, file_t ft) {
std::vector<std::ofstream*>::iterator i;
std::vector<std::string>::iterator j;
if (of[id]->is_open() == true) {
of[id]->close();
i = of.begin() + id;
j = sv.begin() + id;
free(of[id]);
of.erase(i);
sv.erase(j);
}
}
但我还没试过。只是现在没有编译器错误。
- 使用std::source_location报告错误的最佳实践
- std::is_base_of表示ctor编译错误
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 程序崩溃并显示"std::out_of_range"错误
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 尝试使用 std::vector<std::thread时出现静态断言失败错误>
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 为什么 std::绑定错误参数可以成功?
- std::cout输出int时出现编译错误
- 使用静态库与 std::jthread (g++-10) 的分段错误
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 使用 memcpy() 复制到 std::chrono::milliseconds 会给出错误 -Werror=clas
- 显式 std::exception_ptr 转换为 bool 不存在.VS2010 错误?
- "random_shuffle":不是"std"错误的成员
- VC++ 2010 "array is not a member of std"错误
- 开发C++ "to_string is not a member of std"错误
- STD未来异常-已检索,STD错误
- 交叉编译c++的树莓派std错误