gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:05:25 25 4
gpt4 key购买 nike

我在*将删除仿函数传递给 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 参数,除了与不正确图像相关的明显资源泄漏之外,程序编译并运行良好删除..)

最佳答案

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

你的删除器不需要任何参数,所以它不会工作;您需要将其更改为 void operator()(SourceImage*)

关于c++ - 为什么 std::shared_ptr 不接受我的删除函数对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19850314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com