Std :: vector <std :: ofstream> :: erase gives compilation error

Hi i am trying to do some file operations and user can open multiple files if needed. I created a vector I got ofstream

, but when I want to remove i. the element (which closed the file) with the std::vector<Type>::erase(std::vector<Type>::iterator)

compiler gives me an error, but I have another vector obtained std::string

and I erase it in the same way that it does not give an error. My codes:

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

      

I am using Nsight Eclipse Edition 6.0 on Ubuntu 12.04 and I need an open file or files anyway, errors from Problem section for eclipse outputs:

  • required from '_OI std :: __ copy_move_a (_II, _II, _OI) [with bool _IsMove = false; _II = std :: basic_ofstream; _OI = std :: basic_ofstream]
  • required from '_OI std :: __ copy_move_a2 (_II, _II, _OI) [with bool _IsMove = false; _II = __gnu_cxx :: __ normal_iterator *, std :: vector →; _OI = __gnu_cxx :: __ normal_iterator *, std :: vector →]
  • required from '_OI std :: copy (_II, _II, _OI) [with _II = __gnu_cxx :: __ normal_iterator *, std :: vector ->; _OI = __gnu_cxx :: __ normal_iterator *, std :: vector →]
  • required from '_OI std :: copy (_II, _II, _OI) [with _II = __gnu_cxx :: __ normal_iterator *, std :: vector ->; _OI = __gnu_cxx :: __ normal_iterator *, std :: vector →]
  • std :: basic_streambuf <_CharT, _Traits> & std :: basic_streambuf <_CharT, _Traits> :: operator = (const std :: basic_streambuf <_CharT, _Traits> &) [with _CharT = char; _Traits = std :: char_traits]
  • std :: ios_base & std :: ios_base :: operator = (const std :: ios_base &)
  • make: *** [dosya / dosya.o] Error 1
  • in this content
  • in this content
  • required from here

Last error pointing to a line of code

Compiler output: (Some words in Turkish, 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)`

      

I have no idea. I also looked at this , this , this , this (this is about the eclipse bug ), the FAQ is q7.1, this (about the List, but the error is the same and say the error is not actually an error and I haven't changed the compiler (nvcc )). Thanks everyone.

+3


source to share


3 answers


A std :: vector contains its elements in a contiguous block of memory with no spaces. To erase an element, all elements to be moved or copied to new positions. Std :: ofstream in this case cannot be moved, so it starts with a compilation error.

Don't use std :: ofstream directly in std :: vector. It works with references, pointers, or - I prefer - std :: unique_ptr.



It also works with std :: list instead of vector. std :: list has a different way of holding its elements, it doesn't move them. But I'm not sure if this is a better way than reference / pinter / std_unique_ptr in std: vector.

+1


source


Gcc-4.8 does not support moving streams. Your code is C ++ 11 compliant in this respect, just your implementation is not.



+2


source


I changed the code and now it has no error. Thanks everyone.

Now this:

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

      

but I haven't tried it yet. There is simply no compiler error.

-2


source







All Articles