У меня возникла проблема с * передачей функции deleter в std :: smart_ptr *. Это первый раз, когда я пробовал что-то вроде этого, поэтому я мог бы пропустить что-то очень простое.Почему std :: shared_ptr не принимает мой объект функции deleter?
Вот как выглядит класс моего класса;
#pragma once;
#ifndef ASSETDELETERS_H
#define ASSETDELETERS_H
#include "RenderSystem.h"
struct SourceImageDeleter
{
RenderSystem & refGraphicsRenderer;
unsigned int * ptrTextureID;
explicit SourceImageDeleter(RenderSystem & tempRef, unsigned int * tempPtrID)
: refGraphicsRenderer(tempRef) ,
ptrTextureID(tempPtrID) {};
SourceImageDeleter(const SourceImageDeleter & originalCopy)
: refGraphicsRenderer(originalCopy.refGraphicsRenderer) ,
ptrTextureID(originalCopy.ptrTextureID) {};
void operator()()
{
refGraphicsRenderer.deregisterTexture(ptrTextureID);
}
};
#endif
Функция RenderSystem :: deregisterTexture требует только один аргумент (беззнаковое INT *), из-за того, что это время прошло при создании функтора. Я изучил использование std :: bind, но у меня нет большого опыта в этом, и он не смог добиться большого успеха, используя его вместо создания функтора.
А вот единственный метод, который использует его до сих пор ..
std::shared_ptr<SourceImage> Engine::createSourceImage(std::string tempFilepath)
{
SourceImage * tempImagePtr = new SourceImage(tempFilepath);
registerTexture(&tempImagePtr->textureID, &tempImagePtr->image);
return std::shared_ptr<SourceImage>(tempImagePtr , SourceImageDeleter(this->graphicsRenderer, &tempImagePtr->textureID));
}
Я не знаю, почему это не работает! Я в основном пытался, чтобы моя smart_ptr запускала функцию пользовательского удаления всю неделю, и между попытками выяснить, как работает передача указателей на метод, как работает std :: bind/std :: mem_fun_ref и как работают функторы все время цепляли меня всю неделю.
В любом случае, вот компиляция, которую Visual Studio мне дала, я надеюсь, что кто-то может помочь мне разобраться в том, что я напортачил;
error C2064: term does not evaluate to a function taking 1 arguments
1> class does not define an 'operator()' or a user defined conversion operator to a pointer-to-function or reference-to-function that takes appropriate number of arguments
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\memory(1438) : see reference to function template instantiation 'void std::tr1::shared_ptr<_Ty>::_Resetp<_Ux,_Dx>(_Ux *,_Dx)' being compiled
1> with
1> [
1> _Ty=SourceImage,
1> _Ux=SourceImage,
1> _Dx=SourceImageDeleter
1> ]
1> c:\projects\source\engine.cpp(151) : see reference to function template instantiation 'std::tr1::shared_ptr<_Ty>::shared_ptr<SourceImage,SourceImageDeleter>(_Ux *,_Dx)' being compiled
1> with
1> [
1> _Ty=SourceImage,
1> _Ux=SourceImage,
1> _Dx=SourceImageDeleter
1> ]
(Кстати, engine.cpp (151) является обратной линии внутри двигателя :: createSourceImage показано выше .. Если удалить DeleteR аргумент, программа компилируется и работает нормально, кроме очевидных утечек ресурсов связанный с неправильным удалением изображения ..)
Ну, я знал, что это будет что-то просто. Я сейчас на лице всю свою голову! Он работал как шарм. Я отвечу как можно скорее. Спасибо за помощь дофик! – MrKatSwordfish