编译器错误 C3867
这是MSDN给出的产生这个错误的例子
// C3867_4.cpp
// compile with: /c
class A {
public:
void f(int) {}
typedef void (A::*TAmtd)(int);
struct B {
TAmtd p;
};
void g() {
B b1;
b1.p = f; // C3867
}
};
这是因为用A类的F函数赋值给A::B类的函数
但我的代码
class CheckOnce
{
typedef int (*do_sth)(int,int);
bool IsChecked;
bool CheckPara()
{
cout<<"do check"<<endl;
return IsChecked;
}
do_sth do_compute;
int do_compute_with_check(int a, int b)
{
if (CheckPara())
{
do_compute=simple_do_compute;//C3867
}else
{
throw "no check";
}
return 0;
}
int simple_do_compute(int a, int b)
{
cout<<a<<"+"<<b<<endl;
return a+b;
}
public:
CheckOnce():IsChecked(false), do_compute(do_compute_with_check){}//C3867
void SetCheck(bool bCheck = true)
{
IsChecked = bCheck;
}
int DoCompute(int a, int b)
{
return do_compute(a, b);
}
};
我想做一个计算类,一个计算对象在做计算之前检查一遍参数,检查完了,之后该对象的计算就不再进行检查。
[解决办法]
&CheckOnce::do_compute_with_check
这样试试
如果需要一个函数实现不同的功能,建议用虚函数
[解决办法]
#include <iostream>
using namespace std;
class FunPtrTest
{
typedef void (*funcp)();
public:
void doaaa()
{
cout<<"doaaa\n";
}
void DoSomething()
{
funcp dodo(doaaa);
dodo();
}
};
int main(int argc, char *argv[])
{
return 0;
}