2016-11-21 2 views
0

Donc je veux trier un tableau dans la classe mère de l'enfant en utilisant un foncteur d'objet. La classe mère est générique.Tri d'un tableau avec un foncteur personnalisé en C++ où la classe mère est générique

template<typename T> 
class MotherClass 
{ 
public: 
    /* some code */ 

    std::list<T*> getList(); 

private: 
    std::list<T*> list_; 
} 

La classe enfant utilise une autre classe comme modèle

class OtherClass 
{ 
public: 
    /* some code */ 

    std::string getName() const; 

private: 
    std::string name_; 
} 

Voici la classe foncteur

class Functor 
{ 
public: 
    /* some code */ 

    bool operator() (OtherClass* a, OtherClass* b) const 
    { 
    return a->getName() < b->getName(); 
    } 
} 

Enfin, voici la classe enfant

class ChildClass : public MotherClass<OtherClass> 
{ 
public: 
    /* some code */ 

    friend std::ostream& operator<<(std::ostream& o, const ChildClass& child); 
} 

std::ostream& operator<<(std::ostream& o, const ChildClass& child) 
{ 
    Functor functor; 
    std::sort(child.getList().begin(), child.getList().end(), functor); 

    /* some code */ 
} 

Quand je commenter la ligne de tri the ChildClass, la solution construite sans aucun problème. Bien que, quand il est là, cette erreur arrive.

erreur C2784: 'std-type inconnu :: operator - (std :: move_iterator < _RanIt> &, const std :: move_iterator < _RanIt2> &)': ne peut pas déduire un argument de modèle pour « std :: move_iterator < _RanIt> & 'de 'std :: _ List_unchecked_iterator >>'

Tout le monde peut aider?

+0

Veuillez fournir un [mcve]. Je ne comprends pas votre code. par exemple. dans 'l'opérateur <<' vous triez la liste'child's, mais le paramètre 'child' est' const' – user463035818

+2

votre 'child.getList()' retourne une valeur, donc 'child.getList(). begin() 'et child.getList(). end()' sont des itérateurs de deux conteneurs différents – user463035818

+0

Fournissez-vous le premier message d'erreur ou le dernier message d'erreur? Le premier est plus important. – aschepler

Répondre

3

Comme indiqué par std::sortdocumentation il nécessite un accès aléatoire à l'itérateur, ce que ne fournit pas std::list. C'est pourquoi std::list a sa propre méthode std::list::sort si la solution pourrait être:

Functor functor; 
auto list = child.getList(); 
list.sort(functor); 

Remarque: même si vous utilisez conteneur, qui prend en charge iterator d'accès aléatoire méthode ne fonctionnerait pas, chaque fois que vous appelez child.getList() vous créez une nouvelle copie, Ainsi, vous obtiendrez UB pour appeler begin() et end() sur 2 instances différentes. Si votre idée était de trier membre de données, vous devez le retourner par référence, ce qui est une bonne idée, mais serait techniquement travailler:

// if getList() returns reference this would work 
Functor functor; 
child.getList().sort(functor); 

mais mieux vous passez foncteur à une méthode de MotherClass, qui le tri est données.