[C++-sig] cross-module RTTI issues

Dan Haffey dan at theproverbial.com
Mon Mar 14 22:32:31 CET 2005


Hello,

I'm not sure if this is even the right place to post this question, but I'm 
having some trouble with inheritance across shared library boundaries. I've 
read the CrossExtensionModuleDependencies Wiki node, and I assume that my 
problem stems from std::type_info comparison problems, so my question is 
basically: how do I go about making sure my RTTI info is all coming from the 
same place?

I'm specifically referring to this snippet from the Wiki:
"The best way to achieve that is to link both extension modules to a common 
shared library using the global model, and put the RTTI information there."

I'm not sure how exactly I get all the relevant RTTI information into that 
third library.

Just incase I'm completely off-course with my diagnosis of the problem, here's 
an example of what I'm talking about (this breaks in Linux with gcc 3.3.4):
--- A.hpp ---
struct A
{
        A() {}
        virtual int foo() = 0;
};

struct Factory
{
        Factory() {}
        virtual A* make() = 0;
};

--- A.cpp ---
#include "A.hpp"

--- B.hpp ---
#include "A.hpp"

struct B : public A
{
 B() {}
 virtual int foo();
};

struct DerivedFactory : public Factory
{
 DerivedFactory() {}
 virtual A* make();
};

--- B.cpp ---
#include "B.hpp"

int B::foo() { return 42; }
A* DerivedFactory::make() { return new B; }

--- A.pyste ---
A = Class('A', 'A.hpp')
Factory = Class('Factory', 'A.hpp')
set_policy(Factory.make, return_value_policy(reference_existing_object))

--- B.pyste ---
B = Class('B', 'B.hpp')
DerivedFactory = Class('DerivedFactory', 'B.hpp')
set_policy(DerivedFactory.make, 
return_value_policy(reference_existing_object))


And in Python:
>>> import A, B
>>> x = B.DerivedFactory().make()
>>> x.foo()
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
Boost.Python.ArgumentError: Python argument types in
    B.foo(B)
did not match C++ signature:
    foo((anonymous namespace)::B_Wrapper {lvalue})
    foo(B {lvalue})
>>> x = B.B()
>>> x.foo()
42
>>>

Is there a way around this behavior, or is there just no hope for this pattern 
of shared library usage? Any help would be greatly appreciated,

--
Dan Haffey



More information about the Cplusplus-sig mailing list