C++使用另一个类的成员函数进行模板赋值的指针成员函数

发布于 2024-08-26 19:57:51 字数 1501 浏览 6 评论 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;

在另一个类中,我有一个 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 编译项目时,我收到此错误:

错误 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

我可以做作业吗?不?我不知道怎么办:-S 是的,我知道我可以使用其他技术实现相同的目标,但我想知道我该如何做到这一点..

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;

In another class, I have a vector of IShaderParams* and functions that i want to send to "send_to_shader". I'm trying assign the reference of these functions like this:

Vec3ShaderParam *_param = new Vec3ShaderParam;
_param->send_to_shader = &TShader::setVector3;

This is the function:

void TShader::setVector3(const D3DXVECTOR3 &vec, const std::string &name){

 //...
}

And this is the class with 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);

When I compile the project with Visual Studio C++ Express 2008 I recieve this error:

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

Can I do the assignment? No? I don't know how :-S
Yes, I know that I can achieve the same objective with other techniques, but I want to know how can I do this..

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

晨与橙与城 2024-09-02 19:57:52

那是因为您试图使用不兼容的指针。 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&);

That's because you are trying to use incompatible pointers. setVector3 is a TShader method but send_to_shader wants a TShaderParam method.

Not knowing exactly what you want, you can get your example to compile by changing this:

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

to this:

void (TShader::*send_to_shader)( const TParam&,const std::string&);
一生独一 2024-09-02 19:57:52

大概 TShader::send_to_shader 是一个 C 风格的函数指针?

成员函数不能用作函数指针回调 -它们需要一个 this 参数。

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

因此,您可以

  1. 手动将this作为参数传递给静态函数回调,该回调又调用相应实例上的成员函数

  2. 使用接口而不是函数

  3. 使用 < a href="http://en.wikipedia.org/wiki/Function_object#In_C_and_C.2B.2B" rel="nofollow noreferrer">函子

所有这三个都需要轻微的架构更改。

Presumably TShader::send_to_shader is a c-style function pointer?

Member functions cannot be used as function pointer callbacks - they require a this parameter.

Static member functions and global functions can be used as function pointers.

So you can either

  1. pass the this manually as a parameter to a static function callback, which in turn invokes the member function on the appropriate instance

  2. use an interface instead of a function

  3. use a functor

All three require slight architectural changes.

等风来 2024-09-02 19:57:52

指向成员函数的指针有点僵化。如果您向我们展示生成错误的代码行将会有所帮助,但只需查看它,

错误 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

所以你已经传递了一个 void (TShader::* )(const D3DXVECTOR3 &,const std::string &) 但有人期望一个 void (TShaderParam: :* )(const TParam &,const std::string &)

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

希望这会有所帮助!

Pointers to member functions are a bit rigid. It would help if you showed us the line of code that generates the error, but just looking at it,

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

So you've passed a void (TShader::* )(const D3DXVECTOR3 &,const std::string &) but someone expects a void (TShaderParam::* )(const TParam &,const std::string &).

You need to reimplement setVector3 as a method of a type derived from TShaderParam and extract your D3DXVECTOR3 & from the first argument, which must be a TParam. (But if it's just passing back your own value, you can static_cast it to your own type derived from TParam.)

Hope this helps!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文