我有一个函数,它带有一个指向函数的指针:
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);
答案 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();
});
}