2013-03-29 4 views
1

Я пытаюсь реализовать проект Flyweight в C++. Это то, что у меня есть до сих пор.Как вы можете видеть, равны ли общие указатели друг другу

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.get()) 
       return m_Pen; 
     } 

} 

Моя проблема в заявлении else. я пытаюсь выяснить, если оба указателя является одинаковыми, но я получаю сообщение об ошибке говорящего

cannot convert from 'Gdiplus::Pen *' to 'std::tr1::shared_ptr<_Ty>' 

ответ

2

Ваших проблемных строк в этой строке:

std::shared_ptr<Gdiplus::Pen> m_pen = got->second.get(); 

Объяснение:

std::shared_ptr<T>.get() возвращается внутренний указатель хранится в shared_ptr (то есть, Grdiplus::Pen*). Попробуйте вместо этого:

std::shared_ptr<Gdiplus::Pen> m_pen = got->second; 

Это позволит назначить m_pen, так как не существует неявное преобразование из T* в std::shared_ptr<T>.

+0

oh thanks @Tushar –

Смежные вопросы