为什么std :: shared_ptr不会接受我的删除函数对象?

时间:2013-11-08 02:02:04

标签: c++ syntax std shared-ptr functor

我在将删除函数传递给std :: smart_ptr *时遇到问题。这是我第一次尝试这样的东西,所以我可能会忽略一些非常简单的事情。

这是我的仿函数类的样子;

#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函数只需要一个参数(unsigned 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)是上面显示的Engine :: createSourceImage内的返回行。如果我删除了deleter参数,程序编译并运行正常,除了与不正确的图像相关的明显资源泄漏缺失..)

1 个答案:

答案 0 :(得分:2)

std::shared_ptr将删除的指针传递给删除器,这正是您的错误消息所说的:该类没有使用正确数量的参数定义operator()。

您的删除者不期望任何参数,因此它不起作用;您需要将其更改为void operator()(SourceImage*)