0

私は次のクラス構造を持っています (私の実際の実装の単純化された例):

/* TestClass.hpp */
#pragma once

template <class Impl>
class CurRecTemplate {
protected:
    CurRecTemplate() {}
    ~CurRecTemplate() {}

    Impl& impl() { return static_cast<Impl&>(*this); }
    const Impl& impl() const { return static_cast<const Impl&>(*this); }
};

template <class Impl>
class BaseClass : public CurRecTemplate<Impl> {
public:
    BaseClass() { };

    template <class FuncType>
    double eval(const FuncType& func, double x) const
    {
        return this->impl().evalImplementation(func, x);
    }
};

class DerivedClass : public BaseClass<DerivedClass> {
public:
    template <class FuncType>
    double evalImplementation(const FuncType& f, double x) const
    {
        return f(x);
    };
};

その後

/* Source.cpp */
#include <pybind11/pybind11.h>
#include "TestClass.hpp"

namespace py = pybind11;

template<typename Impl>
void declare(py::module &m, const std::string& className) {
    using DeclareClass = BaseClass<Impl>;

    py::class_<DeclareClass, std::shared_ptr<DeclareClass>>(m, className.c_str())
        .def(py::init<>())
        .def("eval", &DeclareClass::eval);
}

PYBIND11_MODULE(PyBindTester, m) {
    declare<DerivedClass>(m, "DerivedClass");
}

これは、この質問PyBind11 Template Class of Many Typesへの回答に大まかに基づいています。ただし、エラーは次のとおりです。

C2783 'pybind11::class_> &pybind11::class_>::def(const char *,Func &&,const Extra &...)': 'Func' のテンプレート引数を推測できませんでした ...\source.cpp 10
C2672 'pybind11::class_>::def': 一致するオーバーロードされた関数が見つかりません ...\source.cpp 12

ジェネリック関数が後で渡されるtemplate <class FuncType>ため、どこにも定義できない秒に関係しているようです。funcこの問題を回避する方法はありますか?

4

1 に答える 1