为什么这个内部类没有编译?

时间:2010-05-25 10:00:01

标签: c++

这是我的代码:

#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&)

我做错了什么?

3 个答案:

答案 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() {

}