我自己实现了一个unique_ptr类,如下所示,并用它来管理另一个类:
namespace mcj {
template <typename CallbackT>
class unique_ptr {
public:
unique_ptr(CallbackT* ptr = nullptr) : ptr_(ptr) {
std::cout << "unique_ptr normal constructor" << std::endl;
}
unique_ptr(unique_ptr<CallbackT>&& ptr) {
if (ptr_) {
delete ptr_;
ptr_ = nullptr;
}
ptr_ = ptr.release();
std::cout << "unique_ptr move constructor(unique_ptr<CallbackT>&& ptr)"
<< std::endl;
}
unique_ptr<CallbackT>& operator=(unique_ptr<CallbackT>&& ptr) {
if (ptr_) {
delete ptr_;
ptr_ = nullptr;
}
ptr_ = ptr.release();
std::cout << "unique_ptr move operation(=)" << std::endl;
return *this;
}
unique_ptr(const unique_ptr<CallbackT>& other) = delete;
unique_ptr<CallbackT>& operator=(const unique_ptr<CallbackT>& other) = delete;
~unique_ptr() {
delete ptr_;
ptr_ = nullptr;
}
CallbackT& operator*() { return *ptr_; }
CallbackT* operator->() { return ptr_; }
CallbackT* get() const { return ptr_; };
CallbackT* release() {
if (ptr_) {
CallbackT* temp = ptr_;
ptr_ = nullptr;
return temp;
}
return ptr_;
}
private:
CallbackT* ptr_;
};
} // namespace mcj
我这样调用mcj::unique_ptr
,A是基类,B是派生类:
mcj::unique_ptr<A> CastToBase() {
return mcj::unique_ptr<B>(new B);
}
mcj::unique_ptr<A> h = CastToBase();
但出现了一个错误:
/Users/chaojie.mo/Documents/test/test/main.cpp:42:10:错误:不可行从类型为"unique_ptr"的返回值到函数的转换返回类型'unique_ptr'返回mcj::unique_ptr(新B(;^~~~~~~候选构造函数不可行:没有来自的已知转换第一个参数unique_ptr的"mcj::unique_ptr'到"A"(回调Tptr=nullptr(:ptr_(ptr({^/Users/chaojie.mo/Documents/test/src/callback_utils.h:15:3:注意:候选构造函数不可行:没有来自的已知转换'mcj::unique_ptr'到'unique_ptr&;'对于第一个参数
unique_ptr(unique_ptr&&ptr({^/Users/chaojie.mo/Documents/test/src/callback_utils.h:35:note:候选构造函数不可行:没有来自的已知转换"mcj::unique_ptr"到"const unique_ptr&"对于第一个参数
unique_ptr(const unique_ptr&other(=delete;
有人能告诉我如何改进mcj::unique_ptr
以支持派生类可以转换为基类吗?
foo<B>
不是c++中foo<B>
的子类。谷歌"c++智能指针中的方差和协方差",
您必须提取指针投射并创建一个新的unique_ptr以返回