|
Boost : |
From: John Hunter (jdhunter_at_[hidden])
Date: 2001-08-19 18:28:48
I have a pure virtual abstract base class with no default constructor,
ie, it handles some data for its derived classes but also has pure
virtual methods. boost::python appears to reject such classes. For
example, the following code fails to compile in boost::python.
class Base {
public:
Base(int i) : _i(i) {}
virtual ~Base() {}
virtual int get() const=0;
protected:
int get_i() const {return _i; }
private:
int _i;
};
struct Derived : Base {
Derived( int i) : Base(i) {}
virtual int get() const { return get_i(); }
};
int get(const Base& b) {
return b.get();
}
which can be used in C++ like:
int main() {
Derived d(1);
Base& b = d;
cout << get(b) << endl;
}
However, when I try to use it with boost::python (1.23.0) as
python::module_builder my_module("my_module");
python::class_builder<Base> base_class(my_module, "Base");
base_class.def(python::constructor<int>());
python::class_builder<Derived> derived_class(my_module, "Derived");
derived_class.def(python::constructor<int>());
derived_class.declare_base(base_class);
my_module.def(get, "get");
I get the compiler error below: basically, it complains that it cannot
create instance_value_holder<...>::m_help since Base has pure virtual
methods.
I guess this is why they say not to store data in abstract base
classes....
Comments?
Thanks,
John Hunter
cd /home/guest/jdhunter/c/trade/python/
g++ -I. -I.. -I/home/guest/jdhunter/c/mylibs -I/usr/local/include/mysql/ -L/usr/local/include -I/home/guest/jdhunter/c/lib/boost_1_23_0 -I/usr/local/include/python1.6 -fPIC -ftemplate-depth-21 test_pure.cpp -lboost_python
/home/guest/jdhunter/c/lib/boost_1_23_0/boost/python/detail/extension_class.hpp: In instantiation of `boost::python::detail::instance_value_holder<Base,boost::python::detail::held_instance<Base> >':
/home/guest/jdhunter/c/lib/boost_1_23_0/boost/python/detail/init_function.hpp:266: instantiated from `boost::python::detail::init1<boost::python::detail::instance_value_holder<Base,boost::python::detail::held_instance<Base> >,const int &>::create_holder(boost::python::detail::extension_instance *, PyObject *, PyObject *) const'
/home/guest/jdhunter/c/lib/boost_1_23_0/boost/python/detail/extension_class.hpp:861: instantiated from here
/home/guest/jdhunter/c/lib/boost_1_23_0/boost/python/detail/extension_class.hpp:778: cannot declare field `boost::python::detail::instance_value_holder<Base,boost::python::detail::held_instance<Base> >::m_held' to be of type `boost::python::detail::held_instance<Base>'
/home/guest/jdhunter/c/lib/boost_1_23_0/boost/python/detail/extension_class.hpp:778: since the following virtual functions are abstract:
test_pure.cpp:7: int Base::get() const
Compilation exited abnormally with code 1 at Sun Aug 19 18:19:37
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk