将 unique_ptr 存储在向量中

Irm*_*rma 2 c++ vector unique-ptr

我已经阅读了很多关于此的主题,到目前为止没有任何解决方案对我有用,所以我一定做错了什么。

这有效:

std::vector<CalendarDay*> calendarWeek;
calendarWeek.push_back(new CalendarDay(hWndParam, ctrlRc, timeParam, week * MY_CLDR_DAYS + day));
Run Code Online (Sandbox Code Playgroud)

这不起作用(根据,它应该起作用):

std::vector<std::unique_ptr<CalendarDay>> calendarWeek;
calendarWeek.push_back(std::unique_ptr<CalendarDay>(new CalendarDay(hWndParam, ctrlRc, timeParam, week * MY_CLDR_DAYS + day)));
Run Code Online (Sandbox Code Playgroud)

这也不起作用(根据,它应该起作用):

std::vector<std::unique_ptr<CalendarDay>> calendarWeek;
std::unique_ptr<CalendarDay> item(new CalendarDay(hWndParam, ctrlRc, timeParam, week * MY_CLDR_DAYS + day));
calendarWeek.push_back(std::move(item));
Run Code Online (Sandbox Code Playgroud)

这也不:

std::vector<std::unique_ptr<CalendarDay>> calendarWeek;
std::unique_ptr<CalendarDay> item(new CalendarDay(hWndParam, ctrlRc, timeParam, week * MY_CLDR_DAYS + day));
calendarWeek.emplace_back(std::move(item));
Run Code Online (Sandbox Code Playgroud)

错误总是相同的:

Error   C2280   'std::unique_ptr<CalendarDay,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

完整代码示例:

//  DECLARED IN HEADER
std::vector<std::vector<std::unique_ptr<CalendarDay>>> calendar; // holds pointer to each day control in calendar


//  MEMBER FUNCTION
void Calendar::GenerateDays
(
      std::shared_ptr<Time> &timeParam // handles time information of displayed data
    , HWND hWndParam // handle to main window
)
{
    //  GENERATE DAY CONTROLS

    for (int week = 0; week < MY_CLDR_WEEKS; week++)
    {
        std::vector<std::unique_ptr<CalendarDay>> calendarWeek; // stores controls for one week
        for (int day = 0; day < MY_CLDR_DAYS; day++)
        {
            //  CREATE NEW CONTROL

            RECT ctrlRc // position of new control in main window
            {
                  daysOfstLeft + day * (dayWidth + dayOfst) // left border
                , daysOfstTop + week * (dayHeight + dayOfst) // top border
                , dayWidth // width
                , dayHeight // height
            };

            //  STORE DAY CONTROL IN VECTOR

            calendarWeek.reserve(sizeof(std::unique_ptr<CalendarDay>));
            calendarWeek.push_back(std::unique_ptr<CalendarDay>(new CalendarDay
            (
                  hWndParam
                , ctrlRc
                , timeParam
                , week * MY_CLDR_DAYS + day
            )));
        }
        calendar.reserve(sizeof(calendarWeek));
        calendar.push_back(calendarWeek);
    }
}
Run Code Online (Sandbox Code Playgroud)

Aza*_*ham 6

根据您的代码,问题似乎出在 function 的最后一行calendar.push_back(calendarWeek)。应该是calendar.emplace_back(std::move(calendarWeek)),否则,您将尝试复制 s 的向量std::unique_ptr,并且由于std::unique_ptrs 没有复制构造函数,因此您将收到编译错误。