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;

別のクラスには、「send_to_shader」に送信したい IShaderParams* と関数のベクトルがあります。これらの関数の参照を次のように割り当てようとしています:

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 &)' を 'void (__thiscall TShaderParam::* )(const TParam に変換できません&,const std::string &)' c:\users\isagoras\documents\mcv\afoc\shader.cpp 127

課題はできますか?いいえ?方法がわからない :-S はい、他の手法でも同じ目的を達成できることはわかっていますが、これを行う方法を知りたい..

4

3 に答える 3

1

おそらくTShader::send_to_shadercスタイルの関数ポインタですか?

メンバー関数は、関数ポインターコールバックとして使用できませんthis。パラメーターが必要です。

静的メンバー関数とグローバル関数は、関数ポインターとして使用できます。

だからあなたはどちらかをすることができます

  1. パラメータとして手動で静的関数コールバックに渡しthisます。静的関数コールバックは、適切なインスタンスでメンバー関数を呼び出します。

  2. 関数の代わりにインターフェースを使用する

  3. ファンクターを使用する

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

合格しましたvoid (TShader::* )(const D3DXVECTOR3 &,const std::string &)が、誰かがを期待していvoid (TShaderParam::* )(const TParam &,const std::string &)ます。

setVector3最初の引数から派生したタイプのメソッドとして再実装し、からTShaderParam抽出する必要があります。D3DXVECTOR3 &最初の引数は。である必要がありますTParam。(ただし、自分の値を返すだけの場合は、static_castから派生した自分のタイプに戻すことができますTParam。)

お役に立てれば!

于 2010-03-26T08:55:50.290 に答える