2014-02-16 3 views
1

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

typedef std::map<PuzzlePartLocation, std::shared_ptr<PuzzleObj>> ComponentsMap; 

Теперь я пытаюсь установить эту карту с элементами через fucntion как это:

void ComponentMadiator::Register(const PuzzlePartLocation puzzlePartLocation,PuzzleObj* puzzleObj) 
{ 
    componentsMap[puzzlePartLocation] = std::make_shared<PuzzleObj>(puzzleObj); 
} 

я просто назвать это так:

PuzzleObj* pPuzzleObjStickLeft = new PuzzleObj() 
pComponentMadiator->Register(1,pPuzzleObjStickLeft); 

PuzzleObj содержит memeber от типа IImageComponent *
PuzzleObj наследует от базового класса

но он дает мне ошибку, как это:

1>c:\program files\microsoft visual studio 11.0\vc\include\memory(873): error C2664: 'PuzzleObj::PuzzleObj(IImageComponent *)' : cannot convert parameter 1 from 'PuzzleObj *' to 'IImageComponent *' 
1>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>   c:\program files\microsoft visual studio 11.0\vc\include\memory(972) : see reference to function template instantiation 'std::_Ref_count_obj<_Ty>::_Ref_count_obj<PuzzleObj*&>(_V0_t)' being compiled 
1>   with 
1>   [ 
1>    _Ty=PuzzleObj, 
1>    _V0_t=PuzzleObj *& 
1>   ] 
1>   c:\program files\microsoft visual studio 11.0\vc\include\memory(972) : see reference to function template instantiation 'std::_Ref_count_obj<_Ty>::_Ref_count_obj<PuzzleObj*&>(_V0_t)' being compiled 
1>   with 
1>   [ 
1>    _Ty=PuzzleObj, 
1>    _V0_t=PuzzleObj *& 
1>   ] 
1>   d:\dev\cpp\cocos2d-x\cocos2d-x-3.0beta2\cocos2d-x-3.0beta2\projects\neonbreaker\classes\componentmadiator.cpp(23) : see reference to function template instantiation 'std::shared_ptr<_Ty> std::make_shared<PuzzleObj,PuzzleObj*&>(_V0_t)' being compiled 
1>   with 
1>   [ 
1>    _Ty=PuzzleObj, 
1>    _V0_t=PuzzleObj *& 
1>   ] 
+0

Если вы имели в виду, чтобы скопировать '' puzzleObj' в ComponentMadiator :: Register', вы должны 'станд :: make_shared (* puzzleObj);' <- разыменовать указатель – dyp

+0

Почему вы можете объяснить это? – user63898

+0

'PuzzleObj' имеет конструктор, который принимает' IImageComponent * ', правильно? – jrok

ответ

1

std::make_shared<PuzzleObj> создает новый PuzzleObj для вас. Вам нужно std::shared_ptr<PuzzleObj>(puzzleObj).

Что еще более важно

void ComponentMadiator::Register(const PuzzlePartLocation puzzlePartLocation,PuzzleObj* puzzleObj); 

должен быть объявлен как:

void ComponentMadiator::Register(const PuzzlePartLocation puzzlePartLocation, std::shared_ptr<PuzzleObj> const& puzzleObj); 

, потому что он разделяет право собственности puzzleObj путем сохранения его в контейнере, и которые должны быть переданы в интерфейсе функции.

И называют это так:

std::shared_ptr<PuzzleObj> pPuzzleObjStickLeft(std::make_shared<PuzzleObj>()); 
pComponentMadiator->Register(1, pPuzzleObjStickLeft); 
+0

его дает мне эту ошибку: 1> d: \ dev \ cpp \ cocos2d-x \ cocos2d-x-3.0beta2 \ cocos2d-x-3.0beta2 \ projects \ neonbreaker \ classes \ helloworldscene.cpp (92): ошибка C2664: 'ComponentMadiator :: Register': не может преобразовать параметр 2 из 'PuzzleObj *' в 'const std :: shared_ptr <_Ty> &' – user63898

+0

@ user63898 Добавлен код вызывающего кода для вас. –

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