0
class IShaderParam{
 public:
 std::string name_value;
};

template<class TParam>
class TShaderParam:public IShaderParam{

public:
 void (TShaderParam::*send_to_shader)( const TParam&,const std::string&);
 TShaderParam():send_to_shader(NULL){}
 TParam value;
 void up_to_shader();
};
typedef TShaderParam<float> FloatShaderParam;
typedef TShaderParam<D3DXVECTOR3> Vec3ShaderParam;

在另一个类中,我有一个 IShaderParams* 向量和我想发送到“send_to_shader”的函数。我正在尝试像这样分配这些函数的引用:

Vec3ShaderParam *_param = new Vec3ShaderParam;
_param->send_to_shader = &TShader::setVector3;

这是功能:

void TShader::setVector3(const D3DXVECTOR3 &vec, const std::string &name){

 //...
}

这是带有 IshaderParams* 的类:

class TShader{

 std::vector<IShaderParam*> params;

public:
 Shader effect;
 std::string technique_name;

 TShader(std::string& afilename):effect(NULL){};
 ~TShader();
 void setVector3(const D3DXVECTOR3 &vec, const std::string &name);

当我使用 Visual Studio C++ Express 2008 编译项目时,我收到此错误:

错误 2 错误 C2440: '=' : 无法进行转换 'void (__thiscall TShader::* )(const D3DXVECTOR3 &,const std::string &)' a 'void (__thiscall TShaderParam::* )(const TParam &,const std::string &)' c:\users\isagoras\documents\mcv\afoc\shader.cpp 127

我可以做任务吗?不?我不知道怎么做 :-S 是的,我知道我可以用其他技术实现相同的目标,但我想知道我该怎么做..

4

3 回答 3

2

那是因为您正在尝试使用不兼容的指针。 setVector3是一种TShader方法,但send_to_shader想要一种TShaderParam方法。

不知道你到底想要什么,你可以通过改变这个来编译你的例子:

void (TShaderParam::*send_to_shader)( const TParam&,const std::string&);

对此:

void (TShader::*send_to_shader)( const TParam&,const std::string&);
于 2010-03-26T06:13:04.573 回答
1

大概TShader::send_to_shader是c风格的函数指针?

成员函数不能用作函数指针回调——它们需要一个this参数。

静态成员函数和全局函数可以用作函数指针。

所以你可以

  1. this手动作为参数传递给静态函数回调,该回调又在适当的实例上调用成员函数

  2. 使用接口而不是函数

  3. 使用函子

这三个都需要轻微的架构更改。

于 2010-03-26T06:18:54.593 回答
0

指向成员函数的指针有点死板。如果您向我们展示了生成错误的代码行,这将有所帮助,但只是看看它,

Error 2 error C2440: '=' :can't make the conversion 'void (__thiscall TShader::* )(const D3DXVECTOR3 &,const std::string &)' a 'void (__thiscall TShaderParam::* )(const TParam &,const std::string &)' c:\users\isagoras\documents\mcv\afoc\shader.cpp 127

所以你已经通过了 avoid (TShader::* )(const D3DXVECTOR3 &,const std::string &)但有人期望 a void (TShaderParam::* )(const TParam &,const std::string &)

您需要重新实现setVector3为派生自第一个参数的类型的方法,TShaderParam并从第一个参数中提取您的方法D3DXVECTOR3 &,该参数必须是TParam. (但如果它只是传回你自己的值,你可以static_cast将它传递给你自己的类型,从TParam.)

希望这可以帮助!

于 2010-03-26T08:55:50.290 回答