Dear all,
thanks a lot for your immediate responses that lead to a fast solution for my
previous problem.
Here comes the next one.
In the example below both classes A and B are derived from std::string. Class B
can be implicitly converted to A by means of 'B::operator const A()'. So the
function printme(const A&) can also be called with an argument of class B (see
main function).
My aim is to be able to call in python:
>>>import boost_ext
>>>b=boost_ext.B("hello world")
>>>boost_ext.printme(b)
but it produces the error:
> <class 'Boost.Python.ArgumentError'>: Python argument types in
> boost_ext.printme(B)
> did not match C++ signature:
> printme(A)
Can I modify the declaration inside BOOST_PYTHON_MODULE so that the implicit
conversion is recognized and the above call boost_ext.printme(b) succeeds?
Thank you
Mihail
BTW, in the code below I'm using a preprocessor definition __BJAM__ which I had
to define explicitly in the Jamroot. Is there some variable defined by default
which I can use to distinguish between bjam builds and other (testing) calls to
g++?
boost.cpp:
#ifdef __BJAM__ // I define __BJAM__ in the Jamroot file..
#include <boost/python.hpp>
#endif
#include <string>
#include <iostream>
class A: public std::string{
public:
A(const std::string&s,int i):std::string(s){}
};
class B: public std::string{
public:
B(const std::string&s):std::string(s){}
operator const A(){return A(*this,-1);}
};
void printme(const A &a){std::cout<<a<<std::endl;}
int main(){
B b("hello world");
printme(b);
}
#ifdef __BJAM__
BOOST_PYTHON_MODULE(boost_ext)
{
using namespace boost::python;
class_<std::string>("string");
class_<A,bases<std::string> > ("A",init<const std::string&,int>());
class_<B,bases<std::string> > ("B",init<const std::string&>());
def("printme",&printme);
}
#endif
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig