別のクラスのメンバー関数を使用したテンプレート割り当てを含む C++ ポインター メンバー関数
-
22-09-2019 - |
質問
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
課題をやってもいいですか?いいえ?方法はわかりません: - はい、私は他のテクニックで同じ目的を達成できることを知っていますが、どうすればこれを行うことができるか知りたいです。
他のヒント
、あなたが互換性のないポインタを使用しようとしているためです。 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&);
メンバ関数へのポインタは、ビット剛性です。あなたは私たちにエラーを生成するコードの行を示したが、ちょうどそれを見て、
場合には役立つだろう
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
することができます。)
希望このことができます!