Je crée actuellement mon conteneur vectoriel personnalisé pour mieux comprendre les vrais conteneurs STL. Je suis confronté au problème de la fonction "insert".
Ce sont deux prototypes de "insert" dans mon conteneur vectoriel.
int main() {
ft::vector<int> my;
my.insert(my.begin(), 5, 6); <-- it calls second proto.
return (0);
}
Quand j'essaye d'utiliser la fonction insert dans main.cpp comme ci-dessous,
XXX
J'avais l'intention d'appeler le premier prototype mais il appelle le second qui est pour les paramètres d'itérateur ... Pourriez-vous s'il vous plaît m'expliquer pourquoi cela se produit et comment le résoudre?
3 Réponses :
La ligne:
my.insert(my.begin(), 5, 6); <-- it calls second proto.
déduira InputIterator en int et ce sera une correspondance parfaite. Au lieu de cela, la première fonction devra convertir le int en size_type et value_type (probablement pas int)
Vous devriez utiliser SFINAE pour restreindre le second pour les types qui correspondent au concept InputIterator , donc seul le premier sera considéré.
Merci pour l'explication :)
Pas de problème, n'hésitez pas à voter pour toute réponse utile, en particulier celle que vous avez acceptée
int main() {
ft::vector<int> my;
my.insert(my.begin(), 5u, 6); <-- it calls the first prototype.
return (0);
}
C'est vrai, mais qu'en est-il de ft :: vector ?
Vous devez utiliser un certain SFINAE pour limiter la surcharge InputIterator aux types d'itérateur.
En supposant que votre itérateur adhère à iterator_traits et / ou a un type imbriqué comme iterator_category , vous pouvez vérifier sa présence via SFINAE:
template <class Iter> using iter_cat_t = typename iterator_traits<Iter>::iterator_category; template <class T, class = void> constexpr bool is_iterator_v = false; template <class T> constexpr bool is_iterator_v<T, std::void_t<iter_cat_t<T>>> = true; template <typename T, typename Alloc> template <class InputIterator, std::enable_if_t<is_iterator_v<InputIterator>, int> = 0> void vector<T, Alloc>::insert(iterator position, InputIterator first, InputIterator last)
Merci beaucoup :)