no match for call [...] besoin de comprendre les circonstances de l'erreur

Le problème exposé dans ce sujet a été résolu.

Je voulais tester un bout de code, mais je suis tombé sur une erreur de compilation. Bien que j’ai réussi a éviter je ne comprends tjr pas pourquoi ça arrive et qu’est-ce qui l’a cause ?

Voici le code :

#include <iostream>
#include <vector>
#include <cassert>

std::vector<int> matches (int j, int m);

// -----------------------------------------------------------------------------

int main ()
{
    int const j { 4 };
    int const m { 0 };

    std::vector<int> const matches { matches (j, m) };
    for (int const matche : matches)
    {
        std::cout << matche << std::endl;
    }

    return 0;
}

// -----------------------------------------------------------------------------

std::vector<int> matches (int j, int m)
{
    assert (j >= 0 and "le nombre de joueurs ne doit pas etre negatif.");
    assert (m >= 0 and "le nombre de matches ne doit pas etre negatif.");

    std::vector<int> matches {};

    while (j != 1)
    {
        --j;
        m += j;
        matches.push_back (m);
    }

    return matches;
}

Voici le message du compilateur :

test.cpp: In function ‘int main()’:
test.cpp:12:51: error: no match for call to ‘(const std::vector<int>) (const int&, const int&)std::vector<int> const matches { matches (j, m) };
                                                   ^
test.cpp:12:53: error: no matching function for call to ‘std::vector<int>::vector(<brace-enclosed initializer list>)’
     std::vector<int> const matches { matches (j, m) };
                                                     ^

Ce message d’erreur est bien trop long que ça mais je l’ai raccourci pour que ça n’étouffe pas trop.

En remplaçant juste le nom du tableau matches par t_matches :

std::vector<int> const t_matches { matches (j, m) };

Ainsi j’évite l’erreur et ce bout de code s’exécute normalement et me donne le résultat prévu. Bref je voulais comprendre les circonstances qui ont provoqué l’erreur afin de ne pas refaire la même erreur. Merci en avance pour votre temps.

// —————————————————————————————————————-

Désolé pour la duplication, ce n’était pas volontaire.

+0 -0

L’erreur est un peu plus claire avec clang :

type 'const std::vector<int>' does not provide a call operator

En gros, ta variable et ta fonction partagent le même nom matches. Lorsque tu déclares ta variable à la ligne 14, le nom matches devient donc immédiatement une référence à la variable et non plus à la fonction. Ainsi, quand tu appelles matches(j, m), tu as une erreur car tu essaies d’appeler ta nouvelle variable (et non pas la fonction).

La solution est effectivement d’éviter de donner le même nom à différentes variables/fonctions. Par convention, on préfère nommer les variables par un nom et les fonctions par un verbe, par exemple make_matches.

PS: match au singulier ne prend pas de E.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte