2013-11-08 4 views
0

У меня возникла проблема с * передачей функции 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 аргумент, программа компилируется и работает нормально, кроме очевидных утечек ресурсов связанный с неправильным удалением изображения ..)

ответ

2

std::shared_ptr передает указатель, удаляемый на удаляющий элемент, что и говорит ваше сообщение об ошибке: класс не определяет operator() с правильным количеством аргументов.

Ваш предприниматель не ожидает каких-либо параметров, поэтому он не будет работать; вам нужно будет поменять его на void operator()(SourceImage*)

+0

Ну, я знал, что это будет что-то просто. Я сейчас на лице всю свою голову! Он работал как шарм. Я отвечу как можно скорее. Спасибо за помощь дофик! – MrKatSwordfish

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