导出模板类的模板函数

时间:2017-06-15 11:34:36

标签: c++ templates boost-python

我无法弄清楚我的代码无法编译的原因

#include <iostream>
#include <sstream>
#include <boost/python/module.hpp>
#include <boost/python/class.hpp>

namespace bp = boost::python;

template<std::size_t Tsize>
class MyClass
{
public:
    MyClass()
    {}

    ~MyClass()
    {}

    template<typename data_t>
    void Sum(data_t* result, const data_t* v1, const data_t* v2)
    {
        for(std::size_t i = 0; i < Tsize; ++i)
            result[i] = v1[i] + v2[i];
    }
};

template<std::size_t Tsize>
void AddMyClass()
{
    typedef MyClass<Tsize> MyClassType;

    std::stringstream ss;
    ss << "MyClass" << Tsize;

    bp::class_<MyClassType, boost::noncopyable>
    (ss.str().c_str(), bp::init<>())
    .def("SumInt", &MyClassType::Sum<int>)
    .def("SumDouble", &MyClassType::Sum<double>)
    ;
}

BOOST_PYTHON_MODULE(myclass)
{
    AddMyClass<1>();
    AddMyClass<2>();
    AddMyClass<3>();
    AddMyClass<4>();
    AddMyClass<5>();
}

编译器抛出错误

error: expected primary-expression before ‘int’
error: expected primary-expression before ‘double’

删除AddMyClass的模板参数会删除错误,但会使代码更长,因为必须导出每种类型的MyClass。

任何人都知道如何解决此错误?

1 个答案:

答案 0 :(得分:4)

缺少template关键字:

.def("SumInt", &MyClassType::template Sum<int>)
.def("SumDouble", &MyClassType::template Sum<double>)