矢量类型<object *>和遍历</object *>

时间:2014-09-10 07:32:04

标签: c++ c++11

这对大多数人来说似乎是一个基本问题,但我不知道。

让我说我做了一个课程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**

如果你愿意告诉我我需要做什么?

2 个答案:

答案 0 :(得分:2)

请注意,predecessorconst,意味着this - predecessor内的const指针为taskList,表示consttaskList.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上的成员访问权限也应为constit变量应声明为std::vector<Task*>::const_iterator,或者在C ++ 11中,您可以使用auto

Task& predecessor(int index) const {
    for (auto it = taskList.begin(); it != taskList.end(); ++it) {
        //do stuff
    }
}