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:
Mon conteneur se présente comme ceci:
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; };
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
7 template <typename T> class List { public: //constructeur, destructeur et autres méthodes omis... void sort(ISorter<T> s); };
dans mon programme ensuite:
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); };
et mon compilo (gcc 4.4.5 sur ubuntu) me crie dessus (comme souvent
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());)
il me retourne une erreur sur la dernière ligne que j'ai écrite ici:
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 error: cannot allocate an object of abstract type ISorter<int>
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part void sort(ISorter<T> s);
J'imagine que quelqu'un a une explication pour un noob comme moi
Merci
Partager