为什么我不能通过此功能?C ++

我有一个函数,它带有一个指向函数的指针:

std::shared_ptr<MyObj> MyObj::Create(const std::function<std::shared_ptr<MyInterface>()>& my_func);

然后我有一个功能,如:

std::shared_ptr<MyInterface> MyQualifier::GetInterfaceInstance() {
    return my_interface_instance;
}

但是当我尝试:

my_obj = MyObj::Create(&MyQualitifer::GetInterfaceInstance);

我收到一个错误:

Reference to type const std::function<std::shared_ptr<MyInterface> ()>' could not bind to an rvalue of type 'std::shared_ptr<MyInterface> (ParentQualifier::MyQualifier::*)()'

为什么是这样?

作为参考,我有一个类似的函数定义为:

std::shared_ptr<MyInterface> CreateMyInterface();

并且以下代码按预期工作:

my_obj = MyObj::Create(&CreateMyInterface);
库纳尔·普里(Kunal Puri)

正如@IgorTandetnik正确指出的那样,问题似乎出在该类的非静态成员函数上。

如果是非静态成员函数,this则由编译器隐式添加。

这就是编译器抱怨的原因。因为该函数与中期望的类型不匹配std::shared_ptr<MyObj> MyObj::Create(const std::function<std::shared_ptr<MyInterface>()>& my_func);

解:

选项1)使其为静态。像这样:

class MyQualifier {
    ...
    public:
    static std::shared_ptr<MyInterface> MyQualifier::GetInterfaceInstance() {
        return my_interface_instance;
    }
}
...
auto my_obj = MyObj::Create(&MyQualitifer::GetInterfaceInstance); // now, this should work

请注意,在这种情况下,my_interface_instance应为静态数据成员。

选项2)创建一个对象MyQualifier并使用lambda。

int main() {
    auto my_obj = MyObj::Create([]() {
        auto myQualifierInstance = MyQualifier{};
        return myQualifierInstance->GetInterfaceInstance();
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能通过有区别的联盟的成员列表来简化此迭代?

为什么此函数(char *)不能通过ref传递?

为什么我不能通过我的代表?

为什么我不能通过 javascript 创建标签

为什么我不能通过地图调度多个动作?

为什么我不能通过python打开/与文件交互

为什么我不能通过Python设置差异?

为什么我不能通过管道传输 BehaviourSubject?

为什么我不能通过服务进入主屏幕

为什么我的jar文件不能通过双击启动?

为什么我不能通过 pygtrie 在特里添加单词?

为什么我不能通过MonadReader约束致电询问

为什么我不能通过php脚本“插入”表?

为什么我不能通过系统调用退出 shellcode?

为什么我不能通过 conda 更新 tensorflow 1.7.0

为什么我不能通过此循环从bash历史记录中删除多个条目

为什么我不能通过模板参数声明一种朋友功能,但是可以使用别名

为什么不能通过这样的参数?

为什么我可以通过 Postman 发送 Post 而不能通过 JS/JQUERY CLIENT

为什么某些Emacs功能不能通过`Mx`使用?

当网站位于localhost时,为什么不能通过邮件功能发送邮件?

为什么不能通过在React(useEffect)中使用清除功能来清除setTimeOut?

为什么不能通过使用“ +”在打印功能的“ str”中添加“ int”?

为什么我不能通过这种形式访问我的servlet?

为什么我不能通过packagist下载我的软件包?

为什么我不能通过VPN与某些ISP连接到我的办公室?

为什么我不能通过 JS 函数更改我的内部 HTML?

为什么我们不能通过.net中的对象访问静态方法

为什么我不能通过内部类引用访问外部类数据成员?