在pybind11绑定中如何获取类中重载模板成员函数的非模板指针?
问题原因与解决方案
问题根源
编译错误的核心原因是:编译器无法从&DerivedFromC::foo中明确选中你要绑定的非模板重载版本。基类C同时提供了无参模板版foo()和带std::string_view参数的非模板版foo,直接取派生类的成员函数地址时,编译器会将两个重载都纳入候选集,导致overload_cast无法正确推导目标函数类型。
解决方法
方法1:强制转换为明确的成员函数指针类型
通过static_cast指定函数的完整签名,帮编译器锁定正确的重载:
pybind11::class_<DerivedFromC, ...some options...>(m, "Name") .def("foo", static_cast<std::shared_ptr<SomeClass> (C::*)(std::string_view)>(&DerivedFromC::foo));
这里明确指定了函数指针的类型为基类C的成员函数,接收std::string_view参数,返回std::shared_ptr<SomeClass>,编译器能直接排除模板重载的干扰。
方法2:直接使用基类的函数指针
由于DerivedFromC继承了C的foo重载,可直接取基类的函数地址,让overload_cast直接匹配目标重载:
pybind11::class_<DerivedFromC, ...some options...>(m, "Name") .def("foo", pybind11::overload_cast<std::string_view>(&C::foo));
这种写法更简洁,避免了派生类地址推导的歧义。
补充说明
模板版foo()虽然是无参函数,但编译器处理&DerivedFromC::foo时仍会将其视为候选重载,必须通过显式类型转换或指定基类函数地址来消除歧义。
内容的提问来源于stack exchange,提问作者arsdever
相关产品推荐
相关产品推荐

