这是我的代码:
#include <algorithm>
class A {
void f() {
struct CompareMe {
bool operator() (int i, int j) { return i < j; }
} comp;
int a[] = {1, 2, 3, 4};
int found = std::min_element(a[0], a[3], comp);
}
}
错误讯息:
no matching function for call to ‘min_element(int&, int&, A::f()::CompareMe&)
我做错了什么?
答案 0 :(得分:5)
错误与您的内部类无关。 STL算法适用于迭代器。 int
s数组中的迭代器是int*
。这些迭代器中的第二个必须总是指向一个传递范围的最后一个元素。
这个
int* found = std::min_element(&a[0], &a[4], comp);
对我来说很好。
但是,据我记得,C ++ 98不允许使用函数本地类类型实例化模板。除非C ++ 03修正了它,否则它仍被禁止。 (我认为C ++ 11将允许它。)因此,为了完全符合当前的C ++标准,您必须将比较器从函数中移出到类中。 (该类或文件本地未命名的命名空间似乎很适合将其移动到哪里。)
答案 1 :(得分:1)
std :: min_element希望迭代器作为前两个参数,而不是值,所以 std :: min_element(&amp; a [0],&amp; a [3],comp)可能有效
答案 2 :(得分:1)
函数局部作用域的内部类不能用于实例化模板。原因是那些本地声明没有链接,因此不能被函数外的代码使用。
这里有其他选项:在全局或未命名的命名空间(文件静态)中声明类中的仿函数。
另一个问题:min_element
返回一个前向迭代器。您需要取消引用它才能获得值。
#include <algorithm>
class A {
struct CompareMe {
bool operator() (int i, int j) { return i < j; }
};
void f() {
int a[] = {1, 2, 3, 4};
int found = *(std::min_element(a, a + 4, CompareMe() ));
}
};
int main() {
}