我有以下问题,解决困难,请帮助。
我有下面的类作为模板定义的地方。
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)指针上调用函数,因此无法立即清楚您想要做什么。
如果您希望mAcceptor
和mDerivedAcceptor
指向相同的(共享的)对象,并且假设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()