我想在派生类(.h或.cpp文件)中实现expose模块。它的工作正常,当我在一个BOOST_PYTHON_MODULE中将它暴露在main中但当我在abstract和派生类中以不同方式暴露时,它得到错误一个或多个多重定义的符号错误。示例代码如下。
**Base.h**
class Base
{
public:
virtual void Set(const std::vector<std::string>& AllParameters) = 0;
};
struct BaseWrap : Base, wrapper<Base>
{
void Set(const std::vector<std::string>& AllParameters)
{
this->get_override("Set")(AllParameters);
}
**Base.cpp**
BOOST_PYTHON_MODULE(Example)
{
class_<Basewrapper , boost::noncopyable> ("Base")
.def("Set",pure_virtual(&Base::Set))
;
}
**Derived.h**
class Derived : public Base
{
public:
int test(int a, int b);
};
BOOST_PYTHON_MODULE(Example)
{
class_<Derived , boost::noncopyable> ("Derived")
.def("test",&Derived ::test)
;
}
**Derived.cpp**
void Derived:: test(int a , int b)
{
return a+b;
}
答案 0 :(得分:1)
BOOST_PYTHON_MODULE
宏定义了一个带有基于提供的参数的标识符的函数。因此,在Example
和Base.cpp
中定义Derived.h
模块在将它们链接到同一个库时会违反one definition rule。要解决此问题,请考虑将导出每个单独类的函数体拆分为它们自己的函数(即export_base()
和export_derived()
),并使用单个文件(example.cpp
)来定义{{1一个调用其他导出函数的主体。可以看到此技术here。