$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Peter Dimov (pdimov_at_[hidden])
Date: 2005-05-08 07:28:29
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();
}