我有以下内容并且难以解决错误,请帮助。
我将以下类作为模板定义。
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));
}
答案 0 :(得分:1)
从您的代码中看起来您希望mAcceptor
被分配为NULL(0),如果是这种情况您根本不需要初始化它,因为默认构造函数将处理。但是,由于你立即在该(NULL)指针上调用一个函数,它不能立即清楚你想要做什么。
如果您希望mAcceptor
和mDerivedAcceptor
指向同一个(共享)对象并假设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()