读书人

编译器异常 C3867

发布时间: 2013-01-12 16:25:03 作者: rapoo

编译器错误 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;
}

读书人网 >C++

热点推荐