別のクラスのメンバー関数を使用したテンプレート割り当てを含む C++ ポインター メンバー関数

StackOverflow https://stackoverflow.com/questions/2521401

質問

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&)' a 'void(__thiscall tshaderparam ::*)(const tparam&、const std: :string&) 'c: users isagoras documents mcv afoc shader.cpp 127

課題をやってもいいですか?いいえ?方法はわかりません: - はい、私は他のテクニックで同じ目的を達成できることを知っていますが、どうすればこれを行うことができるか知りたいです。

役に立ちましたか?

解決

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

メンバー関数 できない 関数ポインタのコールバックとして使用できます - コールバックが必要です this パラメータ。

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

したがって、次のいずれかを行うことができます

  1. 渡す this 静的関数コールバックへのパラメータとして手動で実行すると、適切なインスタンスでメンバー関数が呼び出されます。

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

  3. 使う ファンクタ

3 つともアーキテクチャに若干の変更が必要です。

他のヒント

、あなたが互換性のないポインタを使用しようとしているためです。 setVector3TShader方法ですが、send_to_shaderTShaderParam方法を望んでます。

正確に何をしたい知っていない、あなたはこれを変更することにより、コンパイルするあなたの例を得ることができます:

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

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

メンバ関数へのポインタは、ビット剛性です。あなたは私たちにエラーを生成するコードの行を示したが、ちょうどそれを見て、

場合には役立つだろう
  

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することができます。)

希望このことができます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top