2010-03-26 80 views
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;

在另一个类的成员函数模板分配C++指针成员函数,我有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编译项目我收到此错误:

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

我可以做这项工作吗?没有?我不知道如何:-S 是的,我知道我可以实现与其他技术相同的目标,但我想知道我该怎么做这个..

回答

1

想必TShader::send_to_shader是C风格的函数指针?

成员函数cannot被用作函数指针回调函数 - 它们需要参数this

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

因此你可以

  1. 手动传递this作为参数传递给一个静态函数回调,这反过来又调用了相应的实例

  2. 成员函数使用接口而不是功能

  3. 使用functor

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

+0

C++ 0x将允许从自由函数指针转换为PTMF,我想要求生成一个函子。但我不认为这是他的错误信息表明的问题。 – Potatoswatter 2010-03-26 08:45:53

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&); 
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

所以,你已经通过了void (TShader::*)(const D3DXVECTOR3 &,const std::string &)但有人预计一void (TShaderParam::*)(const TParam &,const std::string &)

你需要重新实现setVector3TShaderParam派生的类型的方法,并从第一个参数,它必须是一个TParam提取您D3DXVECTOR3 &。 (但如果它只是传回自己的价值,你可以static_cast它来自TParam派生自己的类型。)

希望这有助于!