求高手,成员函数指针 类型转换 失败解决思路
求高手,成员函数指针 类型转换 失败
VC2008:
error C2440: “类型转换”: 无法从“void (__thiscall CUse::* )(int)”转换为“ptheHandler”
1> 指向成员的指针有不同的表示形式;无法在它们之间进行类型转换
当CUse::Test2()为virtual,并且继承base,出现以上错误。而只要这两点没有同时满足,则无错误。
当这两点同时满足,且FuncClass也满足这两点,也会正确。
想请教一下有虚函数,且是子类的类 和 不满足这两点的类,
有同样函数声明的 成员函数指针 有什么区别?为何不能相互转换?
------解决方案--------------------
有 std::function 和 lamdba
------解决方案--------------------
虚函数的指针是很麻烦的一件事情,且据说其实现也是编译特定的。 这是因为虚函数指针在调用时也是有多态的,所以比普通指针要额外保存一些信息,并且在调用时生成的机器代码也是不同的,所以即使你绕开了编译器限制强转成功,调用时也不会有好下场的。
去google里搜 "The Impossibly Fast C++ Delegates"。 或者如上面有人推荐的 std::function。
如果不是很特别的用途,我会选 std::function,不过 Sergey Ryazanov 的 Impossibly Fast C++ Delegates 还是值得一看的,比较有意思。
------解决方案--------------------
http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html
就是这篇哈。
楼主如果愿意,可以把函数定义成static
std::function,和std::bind配合使用,也无法传递不定参数,只不过std::function,和std::bind写了10份类似的接口,允许你最多传入10个参数的函数指针
class FuncClass
{
public:
void theHandler(int param);
};
typedef void (FuncClass::*ptheHandler)(int param);
class base
{
};
class CUse : base
{
public:
static void Test1();
virtual void Test2();
void Test3(int iTest);
void Test4(int param);
static int m_iStatic;
int m_iTest;
};
int SomeFunc()
{
ptheHandlerp2;
p2 = (ptheHandler)&CUse::Test4;
}
VC2008:
error C2440: “类型转换”: 无法从“void (__thiscall CUse::* )(int)”转换为“ptheHandler”
1> 指向成员的指针有不同的表示形式;无法在它们之间进行类型转换
当CUse::Test2()为virtual,并且继承base,出现以上错误。而只要这两点没有同时满足,则无错误。
当这两点同时满足,且FuncClass也满足这两点,也会正确。
想请教一下有虚函数,且是子类的类 和 不满足这两点的类,
有同样函数声明的 成员函数指针 有什么区别?为何不能相互转换?
------解决方案--------------------
有 std::function 和 lamdba
------解决方案--------------------
虚函数的指针是很麻烦的一件事情,且据说其实现也是编译特定的。 这是因为虚函数指针在调用时也是有多态的,所以比普通指针要额外保存一些信息,并且在调用时生成的机器代码也是不同的,所以即使你绕开了编译器限制强转成功,调用时也不会有好下场的。
去google里搜 "The Impossibly Fast C++ Delegates"。 或者如上面有人推荐的 std::function。
如果不是很特别的用途,我会选 std::function,不过 Sergey Ryazanov 的 Impossibly Fast C++ Delegates 还是值得一看的,比较有意思。
------解决方案--------------------
虚函数的指针是很麻烦的一件事情,且据说其实现也是编译特定的。 这是因为虚函数指针在调用时也是有多态的,所以比普通指针要额外保存一些信息,并且在调用时生成的机器代码也是不同的,所以即使你绕开了编译器限制强转成功,调用时也不会有好下场的。
去google里搜 "The Impossibly Fast C++ Delegates"。 或者如上面有人推荐的 std::function。
如果不是很特别的用途,我会选 std::function,不过 Sergey Ryazanov 的 Impossibly Fast C++ Delegates 还是值得一看的,比较有意思。
http://www.cnblogs.com/jans2002/archive/2006/10/13/528160.html
就是这篇哈。
楼主如果愿意,可以把函数定义成static
std::function,和std::bind配合使用,也无法传递不定参数,只不过std::function,和std::bind写了10份类似的接口,允许你最多传入10个参数的函数指针