C ++ - 智能指针 - 通过模板将派生类共享指针传递给base

时间:2011-07-25 17:38:36

标签: c++ boost smart-pointers

我有以下内容并且难以解决错误,请帮助。

我将以下类作为模板定义。

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: 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&amp; someHandler);

但由于mAcceptor的类型为SomeAcceptor BaseClassSomeHandler,我得到此错误,但要解决此问题。

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

我尝试在构造函数中执行以下操作,但它无法正常工作

    initialize() : mAcceptor(0), mDerivedAcceptor(new DerivedAcceptor_t) {

        mAcceptor = mDerivedAcceptor;   // Error here

        mAcceptor->SetAcceptNotificationDelegate(fastdelegate::MakeDelegate(this, &initialize::HandleAcceptNotification));
    }

3 个答案:

答案 0 :(得分:1)

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

如果您希望mAcceptormDerivedAcceptor指向同一个(共享)对象并假设DerivedClassSomeHandler来自BaseClassSomeHandler,那么您应该使用这种情况boost::shared_static_cast,如here所述。

this apparently related question还有一些很好的信息。

答案 1 :(得分:0)

错误是由

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

smart_ptr默认构造函数将包装的ptr分配给NULL,因此从初始化列表中省略了mAcceptor(0)。

答案 2 :(得分:0)

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

对你大吼大叫说,没有接受 int 的构造函数。

只需使用: mAcceptor()