Jean-François Brouillet wrote:
So, I added a copy constructor:
template <typename T> struct Bridge : public boost::shared_ptr<T> {
template <typename Y> explicit Bridge(Y * y) : boost::shared_ptr<Y>(y) { if (y) { y->javaConstructor() ; } }
template<typename Y> Bridge(Bridge<Y> const & r) : boost::shared_ptr<Y>(r) { } } ;
But then I get:
/Users/verec/Tools/boost_1_32_0/osx/main.cpp:21: error: type 'class boost::shared_ptr<DisplayStruct>' is not a direct base of 'Bridge<DeviceStruct>'
That's because shared_ptr<Y> is not a base of Bridge<T>, shared_ptr<T> is. Change the templated copy constructor to: template<typename Y> Bridge(Bridge<Y> const & r) : boost::shared_ptr<T>(r) { } and it will compile. You can also use a static create function: class Display { public: typedef shared_ptr<Display> ref; static ref create() { ref r( new Display ); r->constructor(); return r; } private: Display() { ... } }; int main() { Display::ref d = Display::create(); }