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

时间:2019-05-10 03:05:53

标签: 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);

1 个答案:

答案 0 :(得分:2)

@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();
    });
}