2011-07-25 29 views
3

我有以下和难以解决的错误,请帮助。C++ - 智能指针 - 通过派生类共享指针通过模板的基地

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

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>] 

我也试过超载 布尔HandleAcceptNotification功能(DerivedClassSomeHandler & someHandler);

但由于mAcceptor是SomeAcceptor BaseClassSomeHandler类型,我得到这个错误,但要解决这个问题。

我想我需要投它它,但如何做到这一点?

我试图做类似下面的构造函数中,并没有奏效

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

     mAcceptor = mDerivedAcceptor; // Error here 

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

回答

1

从你的代码,它看起来像你想mAcceptor被分配NULL(0),如果是这样的话你不根本不需要初始化它,因为默认的构造函数会处理它。但是,由于您立即在该(空)指针上调用函数,因此不能立即清楚您想要执行的操作。

如果要mAcceptormDerivedAcceptor指向相同的(共享的)对象,并假设DerivedClassSomeHandlerBaseClassSomeHandler衍生,这是一种情况,应该使用boost::shared_static_cast,如所描述here

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

0

该错误是由于在mAcceptor(0)

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

的smart_ptr默认的构造分配包裹PTR为NULL,所以从初始化列表(0)漏下mAcceptor。

0

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

它叫喊你,有没有构造函数接受一个INT

Just use:mAcceptor()