程式碼中 std::map<int, Task> task_map_,呼叫 task_map_[t.getID()] = t 時編譯錯誤,提示 Task 缺少預設建構函數。
map::operator[] 若鍵值不存在,會預設建構一個 Task 物件,再賦值。但 Task 類別僅定義了帶參數建構函數 Task(int id),編譯器不會自動產生預設建構函數,導致錯誤。
Task() : id_(0) {}。insert 或 emplace 避免預設建構:
task_map_.emplace(t.getID(), t); // C++11 直接建構,無需預設建構函數
std::map<int, std::unique_ptr<Task>>,但需管理生命週期。class Task {
public:
Task() : id_(0) {} // 新增預設建構函數
Task(int id) : id_(id) {}
// ... 其他成員 ...
};
class TaskManager {
void addTask(const Task& t) { // 建議傳 const 參考,避免拷貝
task_map_.emplace(t.getID(), t);
}
// ...
};
void addTask(Task t)),改用 const Task& 或右值引用。Task 含有虛函數,確保解構函數為 virtual。理解 STL 容器對元件型別的要求,能有效避免此類編譯期錯誤。