带有显式构造函数的智能指针使我有一个错误

Smart Pointer with explicit constructor gets me an error

本文关键字:指针 有一个 错误 智能 构造函数      更新时间:2023-10-16

我正在尝试构建自己的智能指针,这将使我能够这样声明:

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?

我的问题是,是否有任何方法可以保留我上面提到的所需语法,并且具有明确的ctor?

可能不是。该语法是复制初始化,需要一个非阐明构造函数。

请注意,复制构造函数不需要明确。如果它是明确的,那么您将无法将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>();
相关文章: