智能指针——通过模板传递派生类的共享指针到基类
C++ - Smart Pointers - Passing derived class shared pointer to base through template
我有以下问题,解决困难,请帮助。
我有下面的类作为模板定义的地方。
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()
相关文章:
- 如何从具有移动语义的类对象中生成共享指针
- 使用共享指针的函数调用,其对象应为 const
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何访问由共享指针保存的类方法?
- 从矢量或地图中删除共享指针
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- 使用共享指针实现复制 c'tor?
- C++/QT:使用指向私有成员的常量指针作为只读数据共享
- 共享指针继承,而不先显式强制转换
- 如何检查类中共享指针的有效性?
- 共享 C++ 的数据成员指针
- std::排序在共享指针的向量上
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 在什么情况下,需要共享智能指针而无法使用唯一指针?
- 嵌套类、继承和C++中的共享指针
- <Base> <Derived> 具有相同原始指针共享引用的 shared_ptr 和 shared_ptr 实例是否计数?
- 重载流<<运算符,用于指针/共享指针和其他类型的
- RAW指针共享_ptr
- 指针共享习语
- 将memmove函数与临时指针共享相同的地址