这对大多数人来说似乎是一个基本问题,但我不知道。
让我说我做了一个课程aTask;
Class aTask{
string taskID;
int taskDuration;
std::vector<aTask*> taskList;
//copy constructor and such
aTask(const string& id, int duration){
taskDuraion = duration;
TaskId = id;
}
Task& predecessor(int index) const{
for (std::vector<Task*>::iterator it = taskList.begin(); it != taskList.end(); ++it) {
//do stuff
}
}
}
编译将不允许我在函数previousteor的for循环定义中编写taskList.begin()或taskList.end()。编译告诉我,
> **no suitable user-defined conversion from "std::_Vector_const_iterator<std::_Vector_val<std::_Simple_types<Task
> *>>>" to "std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Task *>>>"
> exists**
如果你愿意告诉我我需要做什么?
答案 0 :(得分:2)
请注意,predecessor
为const
,意味着this
- predecessor
内的const
指针为taskList
,表示const
为taskList.begin()
}。 std::vector<Task*>::const_iterator
会返回一个std::vector<Task*>::iterator
,它不能转换为std::vector<Task*>::const_iterator
,因为这会破坏常量。
要解决此问题,您可以使用评论中提到的//no need to worry about complicated types
for (auto it = begin(taskList); it != end(taskList); ++it){
//do stuff
}
//no need to worry about anything
for (auto &&task : taskList){
//do stuff
}
。但是,既然你标记了[c ++ 11],那么有更好的方法:
it
当然这些也保留了const正确性,因此除非您从task
删除const
,否则无法修改predecessor
或{{1}}。
答案 1 :(得分:0)
由于您的predecessor
功能为const
,因此aTask
上的成员访问权限也应为const
。 it
变量应声明为std::vector<Task*>::const_iterator
,或者在C ++ 11中,您可以使用auto
。
Task& predecessor(int index) const {
for (auto it = taskList.begin(); it != taskList.end(); ++it) {
//do stuff
}
}