2010-03-26 93 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派生自己的類型。)

希望這有助於!