平安2010
[新手]
c++编译错
50分
#include <stdio.h>
class Man
{
private:
typedef struct sAct{
void (*Func)();
sAct(){Func = NULL;}
}sAct;
protected:
sAct *m_Act;
public:
Man(){m_Act = NULL;}
void Move(){;}
void ActionSet(void (*Func)()){;}
};
int main()
{
Man man;
man.ActionSet(man.Move);
return 0;
}
这个程序编译后,错误是:
C:/Documents and Settings/microsoft/桌面/test/main.cpp(21)
: error C2664: 'ActionSet' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)'
None of the functions with this name in scope match the target type
把void Move(){;}改成static void Move(){;}后编译成功,为什么啊?
class Man
{
private:
typedef struct sAct{
void (*Func)();
sAct(){Func = NULL;}
}sAct;
protected:
sAct *m_Act;
public:
Man(){m_Act = NULL;}
void Move(){;}
void ActionSet(void (*Func)()){;}
};
int main()
{
Man man;
man.ActionSet(man.Move);
return 0;
}
这个程序编译后,错误是:
C:/Documents and Settings/microsoft/桌面/test/main.cpp(21)
: error C2664: 'ActionSet' : cannot convert parameter 1 from 'void (void)' to 'void (__cdecl *)(void)'
None of the functions with this name in scope match the target type
把void Move(){;}改成static void Move(){;}后编译成功,为什么啊?
成员函数是this call的, 调用的时候默认会将this指针作为函数最后一个参数;而静态成员函数通过静态,脱离了this,所以是可以强转为一般函数指针的,也就是上面的cdecl。
如果你想保存成员函数为一般函数指针,并像普通函数那样用,那就只有声明其为静态一种方式。
另外针对你的例子,不改成static的方式是如下的:
#include <stdio.h>
class Man
{
private:
typedef struct sAct{
void (*Func)();
sAct(){Func = NULL;}
}sAct;
protected:
sAct *m_Act;
public:
Man(){m_Act = NULL;}
void Move(){;}
void ActionSet(void (Man::*Func)()){;}
};
int main()
{
Man man;
man.ActionSet(&Man::Move);
return 0;
}
ps:请使用最新的编译器,以方便查错:
我的vs2008是这么写的,明显多了:
error C2664: “Man::ActionSet”: 不能将参数 1 从“void (__thiscall Man::* )(void)”转换为“void (__cdecl *)(void)”
如果你想保存成员函数为一般函数指针,并像普通函数那样用,那就只有声明其为静态一种方式。
另外针对你的例子,不改成static的方式是如下的:
#include <stdio.h>
class Man
{
private:
typedef struct sAct{
void (*Func)();
sAct(){Func = NULL;}
}sAct;
protected:
sAct *m_Act;
public:
Man(){m_Act = NULL;}
void Move(){;}
void ActionSet(void (Man::*Func)()){;}
};
int main()
{
Man man;
man.ActionSet(&Man::Move);
return 0;
}
ps:请使用最新的编译器,以方便查错:
我的vs2008是这么写的,明显多了:
error C2664: “Man::ActionSet”: 不能将参数 1 从“void (__thiscall Man::* )(void)”转换为“void (__cdecl *)(void)”