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