How can I set up a map with string as key and ostream as value?
Asked Answered
K

3

5

I am trying to use the map container in C++ in the following way: The Key is a string and the value is an object of type ofstream. My code looks as follows:

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

However, when I try to compile the above code, I get the following error:

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

What is going wrong? If this cannot be done using map, is there some other way to create such key:value pair?

Note: If I test my code with map<string, int> foo; it works fine.

Knar answered 30/11, 2009 at 12:41 Comment(1)
As a style aside, you can define fooMap as mapType e.g. mapType fooMap; since you have already typedefed it.Borrero
O
12

Streams do not like being copied. The simplest solution is using a pointer (or better, a smart pointer) to a stream in the map:

typedef map<string, ofstream*> mapType;
Oxonian answered 30/11, 2009 at 12:44 Comment(2)
Smart pointer doesn't really mean anything here, unless you also change the allocation to use new.Pyatt
If you do use a smart pointer, avoid auto_ptr. You don't want transfer of ownership on assignment in this case.Helicoid
N
1

Objects of type ofstream aren't copiable, which is a precondition to be put into any Standard Library container.

Nesto answered 30/11, 2009 at 12:43 Comment(0)
T
1

The operator= is private for std::ios_base, from which ofstream is derived. So you can't copy the objects foo1 and foo2.

Tetrameter answered 30/11, 2009 at 12:46 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.