2013-03-30 2 views
0
std::unordered_map<std::pair<Gdiplus::Color, float>, std::shared_ptr<Gdiplus::Pen>> mymap; 
input = std::make_pair(color, width); 

Когда я пытаюсь сделатьUnordered.map вопрос вставки с помощью клавиш пары

mymap.insert(std::make_pair(color,width), pen); 

Я получаю C2664: «станд :: _ List_iterator < _Mylist> станд :: _ Hash < _Traits> :: вставить & > (станд :: _ List_const_iterator < _Mylist> _ Valty)»: не удается преобразовать параметр 1 из 'станд :: пары < _Ty1, _Ty2>' на 'станд :: _ List_const_iterator < _Mylist>' 1>

Я попытался сделать

mymap.insert(std::make_pair(input,pen)) 

, но это также дает мне ошибку. я не понимаю, почему так ввода пара цвета и плавать

Я добавляю весь код, потому что я все еще получаю вопросы

std::unordered_map<std::pair<Gdiplus::Color, float>, std::shared_ptr<Gdiplus::Pen>> mymap; 
std::shared_ptr<Gdiplus::Pen> getPen(Gdiplus::Color const & color, float width) 
{ 
    std::pair<Gdiplus::Color,float> input; 
    input = std::make_pair(color, width); 
    std::unordered_map<std::pair<Gdiplus::Color, float>, std::shared_ptr<Gdiplus::Pen>>::const_iterator got = mymap.find (input); 

     if (got == mymap.end()) 
     { 
      auto pen = std::make_shared<Gdiplus::Pen>(); 
      pen->SetColor(color); 
      pen->SetWidth(width); 
      //std::pair<Gdiplus::Color,float> input2; 
      mymap.insert(std::make_pair(input, pen)); 
      return pen;    
     }  
     else 
     { 
      if (std::shared_ptr<Gdiplus::Pen> m_pen = got->second) 
       return m_Pen; 
     } 

} 

};

error C2440: 'type cast' : cannot convert from 'const std::pair<_Ty1,_Ty2>' to 'size_t' with 
     [ 
      _Ty1=Gdiplus::Color, 
      _Ty2=float 
     ] 
+0

Что такое 'Gdiplus :: Color'? Это переименование? Если нет, может отсутствовать хэш-функция. Работает ли std :: map? – balki

ответ

3

Использование emplace(key, value) или insert(pair).

mymap.emplace(std::make_pair(color, width), pen); 
mymap.insert(std::make_pair(std::make_pair(color, width), pen)); 

insert(it, pair) принимает итератор в качестве первого аргумента (в качестве подсказки для увеличения производительности), а не ключ.

+0

я все еще получаю C2440 ошибки: 'приведение типа': не удается преобразовать из 'сопзЬ станд :: пары <_Ty1,_Ty2>' до 'size_t' 1> с 1> [ 1> _Ty1 = Gdiplus :: Color, 1> _Ty2 = float 1>] –

+0

он не говорит строки, хотя это странно ... плохо опубликовать весь код –

+0

@MichaelAfonso: Если вы используете VC++ 2010, то 'emplace' не поддерживается. – ildjarn