1

我正在创建一个结构列表:

struct task{
    int task_id;
    bool is_done;
    char* buffer;
    int length;

} task;
list<task> taskList;

并尝试迭代任务以检查 is_done 状态:

    for (std::list<task>::const_iterator iterator = taskList.begin(), end = taskList.end(); iterator != end; ++iterator) {

        if(iterator->is_done) {
            return 1;
        } else {
            return 2;
        }
    }

我哪里错了?我得到:'->' 标记之前缺少模板参数

4

4 回答 4

3

迭代器operator->已经完成了取消引用。所以而不是

if(*iterator->is_done==true)

你需要

if(iterator->is_done==true)

相当于

if((*iterator).is_done==true)

作为旁注相当于更容易阅读

if((*iterator).is_done)

或者

if(iterator->is_done)

. 更好的是,您还可以使用std::any_of

#include <algorithm>

....

if (any_of(begin(taskList), end(taskList), 
    [](task const &t) { return t.is_done; }))
{
    return 1;
} else {
    return 2;
}

非正式说明:不需要限定any_of,beginendwith std::, 因为taskList是 type ,C++ 编译器会在-namespace 中为您std::list<?>查找这些函数。std

于 2013-05-04T08:58:14.943 回答
0

像这样

if (iterator->is_done==true){

不需要*and ->

不是你问的问题,而是

if (iterator->is_done==true) {

和更容易理解的完全一样

if (iterator->is_done) {

不要将布尔值与真假进行比较,它们已经是真假。

于 2013-05-04T08:57:46.433 回答
0

改用std::find_if

#include <algorithm>

...

bool isDone(const task &task)
{
    return task.is_done;
}

...

return std::find_if(taskList.begin(), taskList.end(), isDone) == taskList.end() ? 2 : 1;
于 2013-05-04T09:01:19.813 回答
0

试试这个。注意对任务结构和引用迭代器的更改。(我更改了迭代器的名称 - 更简洁 - 但实际上并不是必需的)。我只是觉得看起来不那么混乱。

#include <list>

using namespace std;

struct task{
    int task_id;
    bool is_done;
    char* buffer;
    int length;

};


int main() {

    std::list<task> taskList;
    task task1;
    task1.buffer = "qwerty";
    task1.is_done = true;
    task1.length = 6;
    task1.task_id = 1;
    taskList.push_back(task1);


    for (std::list<task>::const_iterator it = taskList.begin(), end = taskList.end(); 
       it != end; ++it) {
        if((*it).is_done==true)
            return 1;
        else
            return 2;
    }

    return 0;
}
于 2013-05-04T09:06:28.033 回答