2017-06-15 176 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