IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

error: no matching function for call to 'survingt'


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Par défaut error: no matching function for call to 'survingt'
    Bonsoir,

    J'obtiens l'erreur suivante error: no matching function for call to 'survingt', j'ai pourtant vérifié mon code une dizaine de fois, en particulier les types, puis je suis allé me renseigné sur internet mais je n'ai pas trouvé d'informations permettant de résoudre mon problème. Je pense qu'il doit me manquer une notion, où alors j'ai une poutre dans l'oeil.

    Bon en gros le programme doit récupérer le nombre de points par question obtenus pour chaque élève.
    A la fin, et c'est là où ça plante, après avoir donné la somme de tous les points obtenus par élève, il me donne une note sur 20 pour chacun (nbe de question total multiplié par le nbe de points obtenus, divisé par 20). Mais voilà il me dit que ma fonction qui sert à faire ce petit calcul ne match pas ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    #include <iostream>
    #include <vector>
    #include <string>
    #include <sstream>
    #include <limits>
    #include "decla.h"
     
    using namespace std;
     
     
    int main()
    {
     
    string::size_type TAILLE;
    char souhait;
    string entree;
    int nbjoueur, calcul_somme;
    double point; 
    double note_sur_vingt;
     
    double nbe_question = 0;
    cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
     
    cout << "- - - LA GABI : Compter les Points - - -" << "\n" << "\n" << endl; 
     
    cout << "APPUYEZ SUR ENTREE POUR COMMENCER" << "\n" << endl;
     
    getline(cin, entree);
     
    // Je récupère le nombre d'élèves:
     
    cout << "Donnez le nombre d'élèves présents" << "\n" << endl;
    cin >> nbjoueur;
    vector<vector<double> > tab;
    tab.resize(nbjoueur);
     
    vector <string> tab_nom(nbjoueur);
     
    // Je récupère les noms des élèves
     
    cout << "\n"<< "Rentrez le nom de chaque joueurs" << "\n" << endl;
     
    for (int i(0); i < nbjoueur; i++) 
    {
    	cout << "\n" << "Joueur n° " << i+1 << ":" << "\n" << endl;
     	cin >> tab_nom[i];
    }
     
    		// Je récupère le point 
     
    		do
    		{
    		cout << "\n" << "ENTREE DES POINTS" << "\t" << endl;
    		nbe_question++; 
     
    			for (int j(0); j < nbjoueur; j++)
    			{
    				point = 0;
    				cout << "\n" << "Entrez le nombre de points de " << tab_nom[j] << "\n" << endl; 
    				cin >> point;
    				tab[j].push_back(point);
    			}
     
    		// Je demande si on continue 
     
    		cout << "\n" << "Continuer à poser des questions : Oui tapez A / Non tapez B" << "\n" << endl; 
    		cin >> souhait; 
     
    		}
    		while (reponse(souhait));
     
     
    		// Je dis combien il y a eu de questions en tout
     
    		cout << nbe_question << " ont été posées" << "\n" << endl;
     
    		// J'affiche tous les éléments du tableau 
     
    			// je récupère la taille
     
    		for (int j(0); j < nbjoueur; j++)
    		{
    			string::size_type TAILLE = tab[0].size();
    			cout << "Voilà ensemble des points de " << tab_nom[j] << "\n" << endl;
     
    			for (int i(0); i < TAILLE; i++)
    			{
    			cout << tab[j][i] << endl;
    			}
    		}
     
    		// Je fais la somme de mes tableaux et j'affiche 
     
    		cout << "Somme des points pour chaque élève" << "\n" << endl;
     
    		for (int j(0); j < nbjoueur; j++)
    		{
    			calcul_somme = 0;
    			calcul_somme = somme(tab[j]);
    			note_sur_vingt = survingt(tab[j], nbe_question);
    			cout << "Score total de " << tab_nom[j] << " :" << "\n" << calcul_somme << "\n" << endl;
    			cout << "Note sur vingt de " << tab_nom[j] << " :" << "\n" << note_sur_vingt << "/20" << "\n" << endl;
    		} 
    		// Je fais le calcul sur 20
    }
    je l'ai déclaré comme ça dans mon header
    double survingt(double, double);

    Puis voilà ma définition :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double survingt (double chiffre, double nbtotal)
    		{
    			double a;
    			a = ((chiffre * 20) / nbtotal);
    			return a;
    		}
    Voilà, si vous pouviez m'aider un peu, je vous en serai gré !
    Bonne soirée/journée !

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Lu,

    Avec l'erreur complète c'est beaucoup plus simple. Celle qui dit qu'une fonction survingt prenant un vector n'existe pas.

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Par défaut
    Salut Jo_link_noir, voilà le truc complet, merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    test_vector.cpp:100:21: error: no matching function for call to 'survingt'
                            note_sur_vingt = survingt(tab[j], nbe_question);
                                             ^~~~~~~~
    ./decla.h:10:8: note: candidate function not viable: no known conversion from
          'value_type'
          (aka 'std::__1::vector<double, std::__1::allocator<double> >') to 'double'
          for 1st argument
    double survingt(double, double); 
           ^
    test_vector.cpp:110:1: error: expected '(' after 'for'
    }
    ^
    test_vector.cpp:126:1: error: expected '}'
    ^
    test_vector.cpp:12:1: note: to match this '{'
    {
    ^
    3 errors generated.

  4. #4
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Salut, à la ligne 100 du fichier qui contient le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    note_sur_vingt = survingt(tab[j], nbe_question);
    tab[j] te donne un vector<double> et non pas un double

  5. #5
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Où se trouve cette fameuse fonction survingt(std::vector<double>, double) ?

  6. #6
    Membre averti
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Par défaut
    SkyZoThreaD, en effet ! D'ailleurs cela m'étonne un peu car les éléments du tableau de type vector sont des double, donc selon cette logique tab_nom[j] devrait être un double, non?

    Jo_link_noir, la déclaration de survingt se situe dans mon header "decla.h" que j'appelle dans mes deux fichiers source, la définition (plus bas) se situe dans mon fichier source de définition

    Bref maintenant il ne veut pas que je multiplie un vector double par un int. C'est un problème que j'ai déjà rencontré, et j'avoue ne pas savoir comment le résoudre
    definition.cpp:46:18: error: invalid operands to binary expression
    ('vector<double>' and 'int')
    a = ((chiffre * 20) / nbtotal);
    ~~~~~~~ ^ ~~
    1 error generated.

    La déf de survingt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    double survingt (vector <double> chiffre, double nbtotal)
    		{
    			double a;
    			a = ((chiffre * 20) / nbtotal);
    			return a;
    		}
    Merci !

  7. #7
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    tab_nom est un vector<string> donc tab_nom[i] donne bien un string.
    mais tab est un vector<vector<string>> donc tab[i] donne un vector<string>.
    Il ne faut pas changer le paramètre de ta fonction en vector<string> mais bien lui donner la string que tu veux.
    Tu ne semble pas du tout maîtriser les vector. Revois un cours C++ sur les vectors et revois ton code. Tu n’apprendras rien si on gère tes erreurs une à unes.

  8. #8
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Citation Envoyé par casse_noix Voir le message
    Jo_link_noir, la déclaration de survingt se situe dans mon header "decla.h" que j'appelle dans mes deux fichiers source, la définition (plus bas) se situe dans mon fichier source de définition
    Perdu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double survingt (double chiffre, double nbtotal) { /*... */ }
    N'est pas la fonction demandée. Tu appelles survingt(std::vector<double>, double) et non survingt(double, double), cette fonction n'existe pas et le compilo s'en plaint.

    Citation Envoyé par casse_noix Voir le message
    Bref maintenant il ne veut pas que je multiplie un vector double par un int. C'est un problème que j'ai déjà rencontré, et j'avoue ne pas savoir comment le résoudre
    Maintenant le compilo trouves la fonction que tu essaie d'appeler, problème : on ne peut pas multiplier un vector avec un int et le compilo te le fait comprendre.

    Un vecteur de double : [0.0, 1.2, 4.0]
    Un int : 42

    Si par multiplication de vecteur par un int tu veux faire 0*42 + 1.2*42 + 4*42, alors tu peux faire ça avec std::accumulate.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    double survingt (std::vector<double> const& chiffre, double nbtotal) {
    	using std::begin;
    	using std::end;
    	return std::accumulate(begin(chiffre), end(chiffre), 0.0,
    	[](double a, double b)->double {
    		return a + b * 20;
    	}) / nbtotal;
    }
    Si la multiplication de vecteur par un int a une autre signification, il faut savoir la signification pour savoir comment le coder (oui, c'est évident).

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    si c'est [0.0*42, 1.2*42, 4.0*42], il y a std::transform, sur le même principe.

  10. #10
    Membre averti
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Par défaut
    Bonsoir,

    Désolé pour l'absence ! J'avais des projets à finir, pas le temps du tout de m'occuper de mon apprentissage personnel !! Et je voulais pas répondre dans la précipitation

    Merci !

    Iradrille, j'ai utilisé ton code, il me sort cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    definition.cpp:45:56: error: expected expression
            return accumulate (begin(chiffre), end(chiffre), 0.0, [] (doubl...
    D'ailleurs, bon j'ai lu la doc dessus, sur transform aussi d'ailleurs, mais j'ai rien compris. Je vois pas ce que représente "a" et "b", j'imagine que le premier c'est chiffre, l'autre nbtotal. Aussi je ne vois pas à quoi correspond le "[]" , ni le "0.0".
    Bref... Et comme ça plante ba impossible de faire des essaie dessus pour essayer de capter tout seul...

  11. #11
    Membre Expert
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Par défaut
    Le couple std::transform / std::accumulate est globalement équivalent au couple map/reduce que fournissent d'autres langages.

    std::transform (map) : prend un vector<A> (ou n'importe quel conteneur) en entrée, et fourni un vector<B> en sorti. Pour chaque élément du conteneur d'entrée, une transformation est faite dessus.
    Si A == B, alors la transformation peut être faite inplace (conteneur d'entrée == conteneur de sortie).

    En pseudocode ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void transform(container<A> as, container<B> bs, Function map_fct) {
       for(int i=0; i<as.size(); ++i) {
          bs[i] = map_fct(as[i]);
       }
    }
    std::accumulate (reduce) : prend un vector<A> (ou n'importe quel conteneur) et une valeur initiale en entrée, et fourni un B en sorti (une seule valeur donc). Pour chaque élément du conteneur d'entrée, une transformation est faite dessus.
    En pseudocode ça donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    B accumulate(container<A> as, B val_initiale, Function reduce_fct) {
       pour chaque élément elt de as {
          val_initiale = reduce_fct(val_initiale, elt);
       }
       return val_initiale;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    return std::accumulate(begin(chiffre), end(chiffre), 0.0,
    [](double a, double b)->double {
    	return a + b * 20;
    }) / nbtotal;
     
    // equivalent à
    double d = std::accumulate(begin(chiffre), end(chiffre), 0.0,
    [](double a, double b)->double {
    	return a + b * 20;
    });
    return d / nbtotal;
     
    // avec
    // begin(chiffre) : iterateur de départ
    // end(chiffre) : iterateur de fin; tous les éléments entre ces deux itérateurs seront traités (ici le vector complet)
    // 0.0 : la valeur initiale, on calcule une somme de produits, au départ la somme est 0
    // [](double a, double b)->double { return a + b * 20; }); : la fonction de réduction
    //    a : valeur initiale
    //    b : élément en train d'être traité
    Pour l'erreur de compilation, c'est surement que ton compilo ne supporte pas c++11, tu peux remplacer la lamdba par une fonction libre ou un foncteur.

  12. #12
    Membre averti
    Homme Profil pro
    Etudiant Informatique & Linguistique
    Inscrit en
    Mars 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Etudiant Informatique & Linguistique

    Informations forums :
    Inscription : Mars 2015
    Messages : 17
    Par défaut
    Merci Iradrille ! Ca me sort d'une vraie impasse !

    Voilà le code réécrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    static double myAdd(double a, double b) {
    	return a + b *20;
    }
     
     
    double survingt(vector <double> chiffre, double nbtotal) {
     
     
    return accumulate(chiffre.begin(), chiffre.end(), 0.0, myAdd) / nbtotal;
    }
    Je vais encore beaucoup m'entraîner avec ces vectors !
    Merci encore

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/01/2012, 14h34
  2. No matching function for call to 'Joueur::Joueur'
    Par Go'Gaule dans le forum Débuter
    Réponses: 4
    Dernier message: 02/07/2011, 07h50
  3. Réponses: 8
    Dernier message: 09/07/2010, 16h02
  4. no matching function for call
    Par pimousse280187 dans le forum Linux
    Réponses: 1
    Dernier message: 06/06/2009, 21h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo