Dear List,
when I use dynamic cast from two boost modules on a class with "vague
linkage", in my real use case a template in the simplified example I
show you a class which is declared inline, then the dynamic cast fails
in the second module.
So when I call the code from python from the first module (in which
the Vertex object has been created), then the dynamic cast succeeds:
"calling performTest(m) ...
I am a Vertex"
but when I do the same from the other module, then I get
"calling performTest2(m) ...
dynamic cast failed, I got the object:
I am a Vertex"
I attached a very simple example in the files:
bugDynamicCastSimplified.h (declares the Classes VerboseObject,
Vertex and Mesh)
bugDynamicCastPy.cpp (first boost module)
bugDynamicCast2Py.cpp (second boost module)
The problem dissapears without the vague linkage, e.g. when you define
REMOVE_INLINE_DEFINITION in the code. This is not a very nice option
for me, as in my real use case Vertex is a template, and this would
force me to initialize it for each type.
My gcc is:
> g++ --version
g++ (Gentoo 4.4.5 p1.2, pie-0.4.5) 4.4.5
And I am building the project with cmake (not boost). I read the FAQ
entry at http://gcc.gnu.org/faq.html#dso and added "-Wl,-E" to
CMAKE_SHARED_LINKER_FLAGS. About the RTLD_GLOBAL flag for dlopen, I
don't know how python handles this.
Do you have any ideas how to solve this? Or is this simply not
possible with python?
-Holger
#pragma once
#include "iostream"
struct VerboseObject {
virtual void describe() = 0;
};
//#define REMOVE_INLINE_DEFINITION
#ifndef REMOVE_VIRTUAL_INHERITANCE
struct Vertex : public VerboseObject
{
virtual void describe() {
std::cout << "I am a Vertex" << std::endl;
}
};
#else
struct Vertex : public VerboseObject
{
virtual void describe();
};
#endif
struct Mesh {
Mesh() {
bulk = new Vertex();
}
~Mesh() {
delete bulk;
}
template<class T>
T* getBulk() const
{
return dynamic_cast<T*>(bulk);
}
VerboseObject* getBulk() const
{
return bulk;
}
static void performTest(const Mesh& m) {
VerboseObject* o = m.getBulk();
Vertex* v = m.getBulk<Vertex>();
if(v != NULL) {
v->describe();
} else {
std::cout << "dynamic cast failed, I got the object:" << std::endl;
o->describe();
}
}
private:
VerboseObject* bulk;
};
#include <boost/python.hpp>
#include "python/bugDynamicCastSimplified.h"
using namespace boost::python;
using namespace std;
BOOST_PYTHON_MODULE(bugDynamicCastPy)
{
class_<Mesh>("mesh", init<>())
;
def("performTest", &Mesh::performTest);
}
#include <boost/python.hpp>
#include "python/bugDynamicCastSimplified.h"
using namespace boost::python;
using namespace std;
BOOST_PYTHON_MODULE(bugDynamicCast2Py)
{
def("performTest2", &Mesh::performTest);
}
#include "bugDynamicCastSimplified.h"
#ifdef REMOVE_VIRTUAL_INHERITANCE
void Vertex::describe()
{
std::cout << "I am a Vertex" << std::endl;
}
#endif
_______________________________________________
Cplusplus-sig mailing list
[email protected]
http://mail.python.org/mailman/listinfo/cplusplus-sig