2010-05-25 56 views
0

這是我的代碼:這個內部類爲什麼不編譯?

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

我在做什麼錯?

回答

5

該錯誤與你的內部類無關。 STL算法在迭代器上工作。進入int的數組的迭代器是int*。這些迭代器中的第二個必須始終指向一個傳遞範圍的最後一個元素。

int* found = std::min_element(&a[0], &a[4], comp); 

爲我工作得很好。

但是,據我所知,C++ 98不允許使用函數本地類類型實例化模板。除非C++ 03解決了這個問題,否則它仍然被禁止。 (儘管如此,我認爲C++ 11將允許它。)因此,爲了完全符合當前的C++標準,您必須將比較器從函數移到類中。 (類或文件的本地具名命名空間似乎對這裏將其移動到很好的候選人。)

+0

這不會拾取最後一個元素。 – 2010-05-25 10:07:21

+0

@Marcelo:你說的對,我解決了。謝謝。 – sbi 2010-05-25 10:08:01

1

的std :: min_element希望迭代器作爲前兩個參數,而不是值,因此 的std :: min_element(&一個[ 0],& a [3],comp)可能工作

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

}