使用自定义对象声明shared_ptr数组时出错C2664

时间:2017-08-05 14:44:26

标签: c++ arrays shared-ptr

使用时我一直收到错误:

std::shared_ptr<ModelType> out(new shared_ptr<ModelType>[m_MAX]);

它是否是实例化shared_ptr数组的正确方法? 错误如下:

错误C2664:&#39; void std :: _ Ptr_base&lt; _Ty&gt; :: _ Reset0(_Ty *,std :: _ Ref_count_base *)&#39;:无法从&#39; std :: shared_ptr转换参数1 * &#39;到&#39; ModelType *&#39;

提前致谢

1 个答案:

答案 0 :(得分:1)

在C ++ 11和C ++ 14标准中,您不能拥有像std::shared_ptr<T[]>这样的共享指针的数组类型,因此您无法为数组分配智能指针。你可以做的是从一个指向数组的唯一指针构造一个:

#include <iostream>
#include <memory>
class ModelType{
};
int main(){
    const int M_MAX = 123;
    std::unique_ptr<ModelType[]> arr(new ModelType[M_MAX]);
    std::shared_ptr<ModelType> ptr(std::move(arr));
}

在C ++ 17标准中,可以使用指向数组类型的共享指针,如std::shared_ptr文档中所述,这样您就可以拥有:

std::shared_ptr<ModelType[]> arr(new ModelType[M_MAX]);

Live example
首选std::make_sharedboost::make_shared mid + \Delta mid直接使用new