2017-06-15 134 views
0

我想不通为什么我下面的代码无法编译导出模板类的模板函数

#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都必须导出。

任何人有一个想法如何解决这个错误?

+0

你尝试'模板'? – Azeem

+0

不,它不起作用 – kstn

回答

4

缺少template关键字:

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

aha,就是那个。 – kstn