我正在尝试构建自己的智能指针,这将允许我这样声明:
SmartPtr<MyClass> ptr = new MyClass;
我希望构造函数是显式的,所以我这样做了:
template<class T>
class SmartPtr
{
public:
SmartPtr();
explicit SmartPtr(T* _ptr);
explicit SmartPtr(const SmartPtr& other);
}
但是,当我尝试按照我在上面提到的那样声明它时,我收到以下错误:
error: conversion from ‘MyClass*’ to non-scalar type ‘SmartPtr<MyClass>’ requested
我知道错误是因为复制CTOR具有带'='的特殊语法,并且无法在该方法中声明转换CTOR。 我的问题是,有没有任何方法可以保持我上面提到的所需语法,并且有一个明确的CTOR?
答案 0 :(得分:1)
我的问题是,有没有任何方法可以保持我上面提到的所需语法,并且有一个明确的CTOR?
可能不是。该语法为copy initialization,它需要非显式构造函数。
请注意,复制构造函数不需要是显式的。如果它是显式的,那么您将无法将SmartPtr
传递给按值接受它的函数。
构造具有最小语法开销的指针的另一种方法是添加工厂函数并使用它:
template<class T>
SmartPtr<T> make_ptr(T* p) {
return SmartPtr<T>{p};
}
auto ptr = make_ptr(new MyClass);
或者,类似于std::make_shared<>
:
auto ptr = make_ptr<MyClass>();