智能指针——通过模板传递派生类的共享指针到基类

C++ - Smart Pointers - Passing derived class shared pointer to base through template

本文关键字:指针 共享 基类 派生 智能      更新时间:2023-10-16

我有以下问题,解决困难,请帮助。

我有下面的类作为模板定义的地方。

template<class ConcreteHandlerType>
class SomeAcceptor: public ACE_Acceptor<ConcreteHandlerType, ACE_SOCK_Acceptor>

在其他文件中,我在构造函数

中初始化该类
class initialize {
    typedef SomeAcceptor<BaseClassSomeHandler> baseAcceptor_t;
    typedef SomeAcceptor<DerivedClassSomeHandler> derivedAcceptor_t;
    boost::shared_ptr<baseAcceptor_t;> mAcceptor;   
    boost::shared_ptr<derivedAcceptor_t;> mDerivedAcceptor;   
    bool HandleAcceptNotification(BaseClassSomeHandler& someHandler);
    initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) {
        mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification));
    }
}

Error i get is

error: no matching function for call to `boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >::shared_ptr(int)'common/lib/boost_1_39_0/boost/smart_ptr/shared_ptr.hpp:160: note: candidates are: boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >::shared_ptr(const boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >&)
common/lib/boost_1_39_0/boost/smart_ptr/shared_ptr.hpp:173: notboost::shared_ptr<T>::shared_ptr() [with T = SomeAcceptor<BaseClassSomeHandler>]

我还尝试了重载函数bool HandleAcceptNotification (DerivedClassSomeHandler&someHandler);

但因为mAcceptor的类型是SomeAcceptor BaseClassSomeHandler,我得到这个错误,但要修复这个

我想我需要以某种方式投射它,但是怎么做呢?

我试着在构造函数中做下面的事情,但是没有成功

    initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) {
        mAcceptor = mDerivedAcceptor;   // Error here
        mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification));
    }

从您的代码中,看起来您希望将mAcceptor分配为NULL(0),如果是这种情况,您根本不需要初始化它,因为默认构造函数将负责此操作。但是,由于您立即在该(NULL)指针上调用函数,因此无法立即清楚您想要做什么。

如果您希望mAcceptormDerivedAcceptor指向相同的(共享的)对象,并且假设DerivedClassSomeHandler派生自BaseClassSomeHandler,那么您应该使用boost::shared_static_cast,如下所述。

在这个明显相关的问题中也有一些好的信息

错误是由于

中的mAcceptor(0)
initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) {
    mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification));
}

smart_ptr默认构造函数将包装后的ptr赋值为NULL,因此在初始化列表中省略mAcceptor(0)。

boost::shared_ptr<SomeAcceptor<BaseClassSomeHandler> >::shared_ptr(int)

它在向你大喊,没有构造函数可以接受int

直接使用:mAcceptor()