Deux versions d'une fonction template avec argument const/non const
Re-bonjour à toutes et à tous !
Je fais passer un visiteur sur tous les noeuds d'un arbre en utilisant une fonction de parcours. Mon mon grand ami compilateur n'aime pas du tout le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| template <typename Visitor, typename T>
Visitor& pre_order_DFS(Visitor& v, Node<T> const& node){
v.visit(node)
// ...
return v;
}
template <typename Visitor, typename T>
Visitor& pre_order_DFS(Visitor& v, Node<T> & node){
v.visit(node)
// ...
return v;
}
template<typename Node>
class AllelicStateInheritance{
public:
void visit(Node & node) {
// ...
}
} |
Il me dit que :
Code:
1 2 3 4
| traversal.h:57:2: error: binding const Node<traversal::CoalescentToDatasetConnector<Coords, unsigned int, genet::Marker_Descriptor<unsigned int> > > to reference of type Node<traversal::CoalescentToDatasetConnector<Coords, unsigned int, genet::Marker_Descriptor<unsigned int> > >& discards qualifiers
v.visit(node);
^
traversal.h:301:7: note: initializing argument 1 of void traversal::AllelicStateInheritance<Node>::visit(Node&) [with Node = Node<traversal::CoalescentToDatasetConnector<Coords, unsigned int, genet::Marker_Descriptor<unsigned int> > >] |
Ce que j'ai traduit par "désolé mon grand, j'arrive pas à envoyer une référence non constante dans la version non constante de la fonction de parcours".
Est-ce que j'ai juste dans la traduction ? Si oui, quelqu'un pourrait m'aiguiller vers la solution technique adaptée ?
Merci à vous ! :)
PS : j'ai trouvé ça, c'est adapté ? Evidemment j'ai pour l'instant rien compris, je me renseigne... ;)
Code:
1 2 3 4 5 6 7 8 9
| template <typename Visitor, typename T>
typename std::enable_if< std::is_same<Aggregate,
typename std::remove_const<T>::type
>::value
>::type
visit( Visitor & v, T & s ) { // T can only be Aggregate or Aggregate const
v(s.i);
v(s.d);
} |