【发布时间】:2021-09-26 23:18:55
【问题描述】:
我正在使用 lambda 函数进行训练,并创建了一个使用模板类合并两个列表的小函数。我想使用 lambda 函数来比较年龄并将它们合并到一个新的列表中,该列表将按升序排列。
编译器告诉no instance of function template "merge_func" matches the argument list。
如果你能帮助我理解我的 lambda 函数出了什么问题,我该如何纠正它。
template <class T>
list<T*> merge_func(list<T*> first_list, list<T*> second_list, bool(*func)(T x, T y))
{
list<T> merge_list;
auto it_first = first_list.begin();
auto it_second = second_list.begin();
while (it_first != first_list.end() && it_second != second_list.end())
{
if ((*func)(*it_first, *it_second))
{
merge_list.push_back((*it_first));
it_first++;
}
else
{
merge_list.push_back((*it_second));
it_second++;
}
}
while (it_first != first_list.end())
{
merge_list.push_back((*it_first));
it_first++;
}
while (it_second != second_list.end())
{
merge_list.push_back((*it_second));
it_second++;
}
return merge_list;
}
class Student
{
public:
string _name;
double _age;
Student(string name, double age) : _name(name), _age(age) {};
};
int main()
{
list<Student*> std;
std.push_back(new Student("Lior", 15.5));
std.push_back(new Student("Yossi", 60));
list<Student*> std2;
std2.push_back(new Student("Arie", 23));
std2.push_back(new Student("Eli", 80));
list<Student*> std3;
std3 = merge_func(std, std2, [](Student* x, Student* y)->bool {return x->_age < y->_age; });
【问题讨论】:
-
您的列表存储 指针 而不是对象。
list<T>应该是list<T*>。 -
您的列表的模板类型为
Student*,但您的 lambda 需要Student参数。这两个不匹配 -
您的 second 问题是您的回调将其参数作为 objects,而不是作为指针。
-
@Someprogrammerdude 谢谢我已经纠正了你所说的但仍然没有编译。
callback是什么意思。看我的代码我编辑它 -
请不要在给出一些有效的 cmets 或答案后更改您的代码。这样你就可以让这些答案看起来是错误的。这也使您的问题对可能有类似问题并为他们寻求解决方案的其他人无法使用。如果您想在原始代码下方显示一个固定代码附加它。
标签: c++ list pointers templates lambda