[C++-sig] Wrapping a pure virtual method with multiple arguments

François ALLAIN frallain at gmail.com
Fri Apr 16 10:42:48 CEST 2010


Hello, I followed the "official" tutorial and others but still don't manage
to expose this pure virtual method (getPeptide) :


ms_mascotresults.hpp

class ms_mascotresults {
        public:

        ms_mascotresults(ms_mascotresfile  &resfile,
                         const unsigned int flags,

                         double             minProbability,
                         int                maxHitsToReport,

                         const char *       unigeneIndexFile,

                         const char *       singleHit = 0);

        ...

        virtual ms_peptide getPeptide(const int q, const int p) const = 0;
}



ms_mascotresults.cpp

#include <boost/python.hpp>
using namespace boost::python;
#include "msparser.hpp" // which includes "ms_mascotresults.hpp"
using namespace matrix_science;
#include <iostream>
#include <sstream>

struct ms_mascotresults_wrapper : ms_mascotresults, wrapper<ms_mascotresults> {

    ms_peptide getPeptide(const int q, const int p) {

        this->get_override("getPeptide")(q);

        this->get_override("getPeptide")(p);

    }
};

BOOST_PYTHON_MODULE(ms_mascotresults)
{
    class_<ms_mascotresults_wrapper, boost::noncopyable>("ms_mascotresults")

        .def("getPeptide", pure_virtual(&ms_mascotresults::getPeptide) )

    ;
}



Here are the bjam's errors :



/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:66:
error: cannot declare field
‘boost::python::objects::value_holder<ms_mascotresults_wrapper>::m_held’
to be of abstract type ‘ms_mascotresults_wrapper’

ms_mascotresults.cpp:12: note:   because the following virtual
functions are pure within ‘ms_mascotresults_wrapper’:
...
include/ms_mascotresults.hpp:334: note:     virtual
matrix_science::ms_peptide
matrix_science::ms_mascotresults::getPeptide(int, int) const

ms_mascotresults.cpp: In constructor
‘ms_mascotresults_wrapper::ms_mascotresults_wrapper()’:

ms_mascotresults.cpp:12: error: no matching function for call to
‘matrix_science::ms_mascotresults::ms_mascotresults()’

include/ms_mascotresults.hpp:284: note: candidates are:
matrix_science::ms_mascotresults::ms_mascotresults(matrix_science::ms_mascotresfile&,
unsigned int, double, int, const char*, const char*)

include/ms_mascotresults.hpp:109: note:
matrix_science::ms_mascotresults::ms_mascotresults(const
matrix_science::ms_mascotresults&)
...
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp: In
constructor ‘boost::python::objects::value_holder<Value>::value_holder(PyObject*)
[with Value = ms_mascotresults_wrapper]’:
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:137:
note: synthesized method
‘ms_mascotresults_wrapper::ms_mascotresults_wrapper()’ first required
here
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:137:
error: cannot allocate an object of abstract type
‘ms_mascotresults_wrapper’

ms_mascotresults.cpp:12: note:   since type ‘ms_mascotresults_wrapper’
has pure vi



Hello, I followed the "official" tutorial and others but still don't manage
to expose this pure virtual method (getPeptide) :
ms_mascotresults.hpp

class ms_mascotresults {
        public:

        ms_mascotresults(ms_mascotresfile  &resfile,
                         const unsigned int flags,

                         double             minProbability,
                         int                maxHitsToReport,

                         const char *       unigeneIndexFile,

                         const char *       singleHit = 0);

        ...

        virtual ms_peptide getPeptide(const int q, const int p) const = 0;
}

ms_mascotresults.cpp

#include <boost/python.hpp>
using namespace boost::python;
#include "msparser.hpp" // which includes "ms_mascotresults.hpp"
using namespace matrix_science;
#include <iostream>
#include <sstream>

struct ms_mascotresults_wrapper : ms_mascotresults, wrapper<ms_mascotresults> {

    ms_peptide getPeptide(const int q, const int p) {

        this->get_override("getPeptide")(q);

        this->get_override("getPeptide")(p);

    }
};

BOOST_PYTHON_MODULE(ms_mascotresults)
{
    class_<ms_mascotresults_wrapper, boost::noncopyable>("ms_mascotresults")

        .def("getPeptide", pure_virtual(&ms_mascotresults::getPeptide) )

    ;
}

Here are the bjam's errors :

/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:66:
error: cannot declare field
‘boost::python::objects::value_holder<ms_mascotresults_wrapper>::m_held’
to be of abstract type ‘ms_mascotresults_wrapper’

ms_mascotresults.cpp:12: note:   because the following virtual
functions are pure within ‘ms_mascotresults_wrapper’:
...
include/ms_mascotresults.hpp:334: note:     virtual
matrix_science::ms_peptide
matrix_science::ms_mascotresults::getPeptide(int, int) const

ms_mascotresults.cpp: In constructor
‘ms_mascotresults_wrapper::ms_mascotresults_wrapper()’:

ms_mascotresults.cpp:12: error: no matching function for call to
‘matrix_science::ms_mascotresults::ms_mascotresults()’

include/ms_mascotresults.hpp:284: note: candidates are:
matrix_science::ms_mascotresults::ms_mascotresults(matrix_science::ms_mascotresfile&,
unsigned int, double, int, const char*, const char*)

include/ms_mascotresults.hpp:109: note:
matrix_science::ms_mascotresults::ms_mascotresults(const
matrix_science::ms_mascotresults&)
...
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp: In
constructor ‘boost::python::objects::value_holder<Value>::value_holder(PyObject*)
[with Value = ms_mascotresults_wrapper]’:
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:137:
note: synthesized method
‘ms_mascotresults_wrapper::ms_mascotresults_wrapper()’ first required
here
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:137:
error: cannot allocate an object of abstract type
‘ms_mascotresults_wrapper’

ms_mascotresults.cpp:12: note:   since type ‘ms_mascotresults_wrapper’
has pure virtual functions



So I tried to change the constructor's signature by :

class_<ms_mascotresults_wrapper,
boost::noncopyable>("ms_mascotresults", init<ms_mascotresfile  &,
const unsigned int, double, int, const char *,const char *>())




Giving these errors :

/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:66:
error: cannot declare field
‘boost::python::objects::value_holder<ms_mascotresults_wrapper>::m_held’
to be of abstract type ‘ms_mascotresults_wrapper’

ms_mascotresults.cpp:12: note:   because the following virtual
functions are pure within ‘ms_mascotresults_wrapper’:

include/ms_mascotresults.hpp:334: note:     virtual
matrix_science::ms_peptide
matrix_science::ms_mascotresults::getPeptide(int, int) const
...
ms_mascotresults.cpp:24:   instantiated from here
/usr/local/boost_1_42_0/boost/python/object/value_holder.hpp:137:
error: no matching function for call to
‘ms_mascotresults_wrapper::ms_mascotresults_wrapper(matrix_science::ms_mascotresfile&,
const unsigned int&, const double&, const int&, const char* const&,
const char* const&)’

ms_mascotresults.cpp:12: note: candidates are:
ms_mascotresults_wrapper::ms_mascotresults_wrapper(const
ms_mascotresults_wrapper&)

ms_mascotresults.cpp:12: note:
ms_mascotresults_wrapper::ms_mascotresults_wrapper()



If I comment the virtual function getPeptide in the .hpp, it builds
perfectly with this constructor :
        class_<ms_mascotresults>("ms_mascotresults", init<ms_mascotresfile
&, const unsigned int, double, int, const char *,const char *>())


This is the first time I use Boost.Python so I don't really know what
happens inside, I don't understand this errors of candidates given the
fact that there is only one constructor in the .hpp ...

Thanks in advance for your help.

Fallino
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cplusplus-sig/attachments/20100416/6314c54c/attachment-0001.html>


More information about the Cplusplus-sig mailing list