bonjour à tous,

Je rencontre un problème avec un foncteur abstrait. Je souhaite avoir une classe conteneur munie d'une méthode 'sort' qui prend un foncteur en argument qui sera ensuite transmis à std::sort de <algorithm>.

J'ai pour cela défini une interface pour mon foncteur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template <typename T>
class ISorter
{
    public:
    virtual bool operator()(T a, T b) = 0;
};
Mon conteneur se présente comme ceci:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
template <typename T>
class List
{
    public:
    //constructeur, destructeur et autres méthodes omis...
    void sort(ISorter<T> s);
};
Ensuite je déclare une implémentation de ISorter:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
class IntSorter: public ISorter<int>
{
    public:
    //constructeur et destructeur omis
    bool operator()(int a, int b);
};
dans mon programme ensuite:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
List<int> lst;
//j'alimente ma liste en entiers
lst.sort(IntSorter());
et mon compilo (gcc 4.4.5 sur ubuntu) me crie dessus (comme souvent )

il me retourne une erreur sur la dernière ligne que j'ai écrite ici:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
error: cannot allocate an object of abstract type ‘ISorter<int>’
Ok, je ne peux pas déclarer une instance d'un type abstrait. Mais ici je déclare une instance d'un type concret. J'imagine qu'il y a un truc qui ch.. dans la colle au niveau de la déclaration de:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
void sort(ISorter<T> s);
Je me suis dit que ça venait peut être de la recopie de l'objet (je n'ai pas défini d'opérateur de copie, mais comme il me semble qu'il ne peut pas être polymorphique je suis embêté), mais j'ai testé une version qui prend un ISorter<T>* sans plus de résultat.

J'imagine que quelqu'un a une explication pour un noob comme moi

Merci