如何在Pybind11中包装模板类函数的共享指针



我想在Pybind11中包装一个模板类函数的共享指针。我的类是模板队列:MyQueue.hpp

template<typename Data>
class MyQueue {
public:
std::queue <Data> the_queue;
static std::shared_ptr<MyQueue<Data>> make_data_q_ptr();
};

MyQueue.cpp

template<typename Data>
std::shared_ptr<MyQueue<Data>> MyQueue<Data>::make_data_q_ptr(){
std::shared_ptr<MyQueue<Data>> data_q_ptr;
data_q_ptr = std::make_shared<MyQueue<Data>>();
return data_q_ptr;
}

MyQueue中的数据类型:DataType.cpp

class DataType
{
public:
uint mynumber;
};

使用Pybind11的包装器:wrap.cpp

namespace py = pybind11;
PYBIND11_MODULE(mymodule, m){

py::class_<MyQueue<DataType>, std::shared_ptr<MyQueue<DataType>>>(m, "MyQueue_DataType")
.def(py::init<>())
.def_static("make_data_q_ptr",&MyQueue<DataType>::make_data_q_ptr);

py::class_<DataType>(m, "DataType")
.def(py::init<>())
.def_readwrite("mynumber",&DataType::mynumber);
}

命令编译代码

g++ -shared -fPIC `pkg-config --cflags --libs opencv` -lpthread -std=c++11 -I./pybind11/include/ `python3.7 -m pybind11 --includes` *.cpp -o mymodule.so `python3.7-config --ldflags`

代码编译成功,但是当我尝试导入我创建的模块"mymodule"时,我得到这个错误:importterror: undefined symbol: xxx

>>> import mymodule
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: /home/pi/templedpybind11/mymodule.so: undefined symbol: _ZN7MyQueueI8DataTypeE15make_data_q_ptrEv

你能帮帮我吗?谢谢你。

Move

template<typename Data>
std::shared_ptr<MyQueue<Data>> MyQueue<Data>::make_data_q_ptr(){
std::shared_ptr<MyQueue<Data>> data_q_ptr;
data_q_ptr = std::make_shared<MyQueue<Data>>();
return data_q_ptr;
}

放到头文件中。在需要看到它的地方,它是不可见的。