函数对象为构造函数参数时

本文探讨了在C++中,当函数对象作为构造函数参数时遇到的问题。示例展示了使用函数对象初始化派生类对象的不同方式,其中一种方式导致编译错误。错误信息表明类型不匹配。通过改变初始化语法,问题得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()};​//改为这样也是可以的,为什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值