Première question sur stackoverflow :) Je suis relativement nouveau en C++, et n'ai jamais utilisé de modèles, alors pardonnez-moi si je fais quelque chose de stupide. J'ai une fonction de modèle qui parcourt une liste et vérifie un élément spécifié d'un type général. De cette façon, je peux spécifier s'il cherche une chaîne, un int, ou autre.La fonction de modèle donne l'erreur "aucune fonction correspondant à l'appel"
template <class T>
bool inList(T match, std::string list)
{
int listlen = sizeof(list);
for (int i = 0; i <= listlen; i++) {
if (list[i] == match) return true;
else continue;
}
return false;
};
Ceci est mon appel à inList()
. testvec
est un vecteur de chaîne avec quelques éléments, y compris « test »:
if (inList<string>("test", testvec))
cout << "success!";
else cout << "fail :(";
À mon grand désarroi et la confusion, à la compilation, je suis giflé avec l'erreur suivante:
error: no matching function for call to 'inList(const char [5], std::vector<std::basic_string<char> >&)'
Qu'est-ce que je fais incorrectement? :(
[EDIT] j'oublié de mentionner que la définition du modèle est dans l'espace de noms global. (C'est un programme de test simple pour voir si mon modèle fonctionne, et il n'a pas, semble-t-:()
La variété est bonne . La réponse courte est de passer une chaîne à la place d'un vecteur de chaînes l'attendant pour la convertir en chaîne. Il y a techniquement 'includes()' ou 'find()' à cette fin cependant; – chris
Je pense que chris a supprimé son commentaire sur ma question avant de rafraîchir ma page, car elle n'est plus là, puisque ce qu'il a mentionné a résolu mon problème. Je me sens très bête. J'avais 'std :: string' comme argument à' inList() 'parce que je ne savais pas que je pourrais utiliser' std :: vector 'littéralement. J'ai pensé que j'aurais dû utiliser 'std :: string' parce que c'est ce que le vecteur a pris, mais maintenant je me sens stupide en y repensant.** Merci à vous deux pour vos réponses, votre réponse est également utile pour référence future, Robert:) ** –
ZeroKnight
Si vous utilisez std :: includes ou std :: find, n'oubliez pas de tester avec end(). in_list (a, b) == [] (const auto & a, const auto & b) {return std :: trouver (b.begin(), b.end(), a)! = b.end(); } - note Je veux dire que lambda est une abstraction, pas un code réel - je sais que nous n'avons pas de lambdas polymorphes. C'est quelque chose que nous devons laisser avec haskell pour le moment. –