Domanda

Sto cercando di utilizzare il contenitore map in C ++ nel modo seguente: La chiave è un string e il valore è un oggetto di tipo ofstream. Il mio codice ha il seguente aspetto:

#include <string>
#include <iostream>
#include <map>
#include <fstream>

using namespace std;

int main()
{
  // typedef map<string, int> mapType2;
  // map<string, int> foo;

  typedef map<string, ofstream> mapType;
  map<string, ofstream> fooMap;

  ofstream foo1;
  ofstream foo2; 

  fooMap["file1"] = foo1;
  fooMap["file2"] = foo2;

  mapType::iterator iter = fooMap.begin();
  cout<< "Key = " <<iter->first;
}

Tuttavia, quando provo a compilare il codice sopra riportato, ottengo il seguente errore:

C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/ios_base.h:
In member function `std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)': 
C:/Dev-Cpp/bin/../lib/gcc/mingw32/3.4.2/../../../../include/c++/3.4.2/bits/ios_base.h:741:
error: `std::ios_base& std::ios_base::operator=(const std::ios_base&)' is private
hash.cpp:88: error: within this context

Cosa non va? Se ciò non è possibile utilizzando map<string, int> foo;, esiste un altro modo per creare tale coppia chiave: valore?

Nota: se collaudo il mio codice con <=> funziona benissimo.

È stato utile?

Soluzione

Agli stream non piace essere copiati. La soluzione più semplice sta usando un puntatore (o meglio, un puntatore intelligente) a uno stream nella mappa:

typedef map<string, ofstream*> mapType;

Altri suggerimenti

Gli oggetti di tipo ofstream non sono copiabili, il che è un prerequisito da inserire in qualsiasi contenitore della Libreria standard.

Il operator= è privato per std::ios_base, da cui deriva ofstream. Quindi non puoi copiare gli oggetti foo1 e foo2.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top