我正在创建一个结构列表:
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;
}
}
我哪里错了? 我得到:在&#39; - &gt;&#39;之前缺少模板参数令牌
答案 0 :(得分: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
,begin
和end
与std::
一致,因为taskList
属于std::list<?>
类型,C ++编译器将为您查找std
- 命名空间中的这些函数。
答案 1 :(得分:0)
喜欢这个
if (iterator->is_done==true){
无需*
和->
。
不是你问的问题,而是
if (iterator->is_done==true) {
与更容易理解
完全相同if (iterator->is_done) {
不要将布尔值与真假相比较,它们已经是真假。
答案 2 :(得分: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;
答案 3 :(得分: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;
}