#c #constants #member-function-pointers #pybind11
Вопрос:
Удивительно (смущающе?) Я не могу правильно понять синтаксис static_const
const
функции-члена. Короче говоря (подробности ниже), если функция-член не отмечена const
Я использую:
static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;)>(amp;mymodule::Foo::bar)
но помечая функцию-член Foo::bar(...) const
, компилятор не знает, что делать:
error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> amp;)'
Куда я должен поместить значение функции? const
Подробные сведения
Я пытаюсь создать привязку Python для следующего модуля:
namespace mymodule {
class Foo
{
public:
Foo() = defau<
template <class T>
T bar(const Tamp; a) const
{
T ret = a;
for (autoamp; i : ret) {
i *= 2.0;
}
return ret;
}
template <class T>
T bar(const Tamp; a, double f) const
{
T ret = a;
for (autoamp; i : ret) {
i *= f;
}
return ret;
}
};
} // namespace mymodule
в результате чего я пишу привязки Python с помощью pybind11:
#include <pybind11/pybind11.h>
namespace py = pybind11;
PYBIND11_MODULE(example, m)
{
py::class_<mymodule::Foo>(m, "Foo")
.def(py::init<>())
.def("bar",
static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;)>(amp;mymodule::Foo::bar),
py::arg("a"))
.def("bar",
static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;, double)>(amp;mymodule::Foo::bar),
py::arg("a"),
py::arg("f"));
}
который не удается скомпилировать:
.../example.cpp:54:14: error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> amp;)'
static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;)>(amp;mymodule::Foo::bar),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.../example.cpp:19:7: note: candidate function template
T bar(const Tamp; a) const
^
.../example.cpp:29:7: note: candidate function template
T bar(const Tamp; a, double f) const
^
.../example.cpp:58:14: error: address of overloaded function 'bar' cannot be static_cast to type 'std::vector<double> (mymodule::Foo::*)(const std::vector<double> amp;, double)'
static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;, double)>(amp;mymodule::Foo::bar),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.../example.cpp:19:7: note: candidate function template
T bar(const Tamp; a) const
^
.../example.cpp:29:7: note: candidate function template
T bar(const Tamp; a, double f) const
^
2 errors generated.
Ответ №1:
Вы должны добавить const
, наконец, как:
static_cast<std::vector<double> (mymodule::Foo::*)(const std::vector<double>amp;) const>(amp;mymodule::Foo::bar),
// ^^^^^
Комментарии:
1. Спасибо!! Я все еще нахожу этот синтаксис время от времени сбивающим с толку.