Как я могу настроить карту со строкой в ​​качестве ключа и ostream в качестве значения? - PullRequest
5 голосов
/ 30 ноября 2009

Я пытаюсь использовать контейнер map в C ++ следующим образом: Ключ является string, а значение является объектом типа ofstream. Мой код выглядит следующим образом:

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

Однако, когда я пытаюсь скомпилировать приведенный выше код, я получаю следующую ошибку:

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

Что не так? Если это невозможно сделать с помощью map, есть ли другой способ создать такую ​​пару ключ: значение?

Примечание. Если я проверю свой код с помощью map<string, int> foo;, он будет работать нормально.

Ответы [ 3 ]

12 голосов
/ 30 ноября 2009

Потоки не любят, когда их копируют. Самое простое решение - использовать указатель (или, что лучше, умный указатель) на поток на карте:

typedef map<string, ofstream*> mapType;
1 голос
/ 30 ноября 2009

operator= является частным для std::ios_base, из которого происходит ofstream. Таким образом, вы не можете скопировать объекты foo1 и foo2.

1 голос
/ 30 ноября 2009

Объекты типа ofstream не копируются, что является предварительным условием для помещения в любой контейнер стандартной библиотеки.

...