2010-05-25 7 views
0

Ceci est mon code:Pourquoi cette classe interne ne compile-t-elle pas?

#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); 
    } 
} 

Message d'erreur:

 
no matching function for call to ‘min_element(int&, int&, A::f()::CompareMe&) 

Qu'est-ce que je fais mal?

Répondre

5

L'erreur n'a rien à voir avec votre classe interne. Les algorithmes STL fonctionnent sur itérateurs. Un itérateur dans un tableau de int s est un int*. Le second de ces itérateurs doit toujours pointer vers un passé le dernier élément de la gamme.

Ce

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

fonctionne bien pour moi. Cependant, pour autant que je m'en souvienne, C++ 98 n'autorisait pas l'instanciation de modèles avec des types de classe fonction-local. À moins que C++ 03 ne le corrige, c'est toujours interdit. (Je pense que C++ 11 le permettra, cependant.) Donc, afin d'être entièrement conforme à la norme C++ actuelle, vous devrez déplacer votre comparateur hors de la fonction dans la classe. (La classe ou un espace de noms sans nom fichier local semblent de bons candidats pour savoir où déplacer.)

+0

Ceci ne ramassera pas le dernier élément. –

+0

@Marcelo: Vous avez raison, j'ai réparé cela. Merci. – sbi

1

std :: min_element veut itérateurs que les deux premiers arguments, non valeurs, donc std :: min_element (& un [ 0], & a [3], comp) peut fonctionner

1

Les classes internes à la portée locale de la fonction ne peuvent pas être utilisées pour instancier des modèles. La raison en est que ces déclarations locales n'ont aucun lien et ne peuvent donc pas être utilisées par du code en dehors de la fonction.

Vous avez d'autres options ici: déclarer le foncteur dans la classe, globalement ou dans un espace de noms sans nom (fichier statique).

Un autre problème: min_element renvoie un itérateur avant. Vous devez le déréférencer pour obtenir la valeur.

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

} 
Questions connexes