2009-10-10 7 views
0

Je suis en train de compiler le code suivant dans C++C++ Erreur: Aucun match pour Call

string initialDecision() 
{ 
char decisionReviewUpdate; 

cout << "Welcome. Type R to review, then press enter." << endl; 
cin >> decisionReviewUpdate; 

// Processing code 
} 

int main() 
{ 
    string initialDecision; 
    initialDecision=initialDecision(); 

    //ERROR OCCURS HERE 

// More processing code 
return 0; 
} 

droit où il est dit « Une erreur se produit ici », je reçois l'erreur suivante lors de la compilation: « Erreur: Non match pour Call to '(std :: string)(). Comment puis-je résoudre ce problème?

Répondre

14

ne donnez pas votre chaîne et votre fonctionner le même nom, et l'erreur disparaîtra

Le compilateur a "oublié" qu'il existe une fonction avec ce nom, lorsque vous déclarez une variable locale avec le même nom.

1

renommez la variable correspond pas au nom de la fonction.

1

Le problème est que vous répétez le nom initialDecision à la fois comme variable et comme fonction. Cela complique grandement le compilateur. Essayez de renommer la variable en autre chose; cela fonctionnera alors.

4

La variable locale affiche le nom de la fonction globale. Il est préférable de renommer la variable locale, mais il y a aussi l'opérateur de portée qui vous permet d'accéder spécifiquement le nom global:

initialDecision = ::initialDecision(); 
3

Ceci est appelé « nom caché » en C++. Dans cet exemple particulier, vous déclarez une variable locale, qui porte le même nom qu'une fonction dans l'étendue de l'espace de noms. Après le point de déclaration de cette variable, la fonction devient cachée, et chaque fois que vous mentionnez le nom 'initialDecision', le compilateur supposera à juste titre que vous faites référence à la variable. Puisque vous ne pouvez pas appliquer l'opérateur d'appel de fonction '()' à une variable de type 'chaîne', le compilateur émet le message d'erreur.

Dans de nombreux cas, pour faire référence à des noms masqués, vous pouvez utiliser l'opérateur de résolution d'étendue '::'. Voir la réponse UncleBens, par exemple.