namespace non_virtual_interface2
{
class base;
int default_health_calc(const base& gc)
{
}
class base
{
public:
typedef std::function health_calc_func;
explicit base(health_calc_func hcf=default_health_calc):m_health_func(hcf)
{
}
int health_value()const
{
return m_health_func(*this);
}
private:
health_calc_func m_health_func;
};
short calc_func(const base&)
{
cout<<"calc_func"<<endl;
}
struct calc_func_object
{
calc_func_object()
{
cout<<"calc_func_object constructor"<<endl;
}
int operator()(const base&)const
{
cout<<"calc_func_object"<<endl;
}
};
class calc_class_member
{
public:
short health(const base&)const
{
cout<<"calc_class_member"<<endl;
}
};
class derived:public base
{
public:
derived(health_calc_func hcf=default_health_calc):base(hcf)
{
cout<<"derived constructor"<<endl;
}
};
void test()
{
// derived* d=new derived();
// d->test_nvi();
// delete d;
// derived d1(calc_func);
// d1.health_value();
// calc_func_object cc;
// derived d2(cc);
// derived d2(calc_func_object());
// d2.health_value();
derived *d2=new derived(calc_func_object());
d2->health_value();
// calc_class_member c;
// // base::health_calc_func cf=std::bind(&calc_class_member::health,&c,std::placeholders::_1);
// // derived d3(cf);
// derived d3(std::bind(&calc_class_member::health,&c,std::placeholders::_1));
// d3.health_value();
}
}
测试结果为:
calc_func_object cc;
derived d2(cc);//这样调用时没问题
derived *d2=new derived(calc_func_object());
d2->health_value();//这样使用也没问题
derived d2(calc_func_object());
d2.health_value();//这样调用时报错,报错信息如下:
error: request for member ‘health_value’ in ‘non_virtual_interface2::d2’, which is of non-class type ‘non_virtual_interface2::derived(non_virtual_interface2::calc_func_object (*)())’
d2.health_value();
谁能给我解答下 为什么?
derived d2{calc_func_object()};//改为这样也是可以的,为什么