Ran dans un problème intéressant aujourd'hui et j'essaie de comprendre pourquoi.Nom de variable identique au nom de la fonction donnant l'erreur du compilateur ... Pourquoi?
Considérez ce qui suit:
class Base
{
public:
Base(){}
~Base(){}
static void function1(){}
void function2()
{
int function1;
function1 = 0;
function1(); //<-compiler error
function1 = 1;
}
};
Je reçois l'erreur suivante:
expression preceding parentheses of apparent call must have (pointer-to-) function type
Je pense que je comprends pourquoi je reçois cette erreur:
Lorsque
function1
est appelé par lui-même en dehors defunction2()
, il est en fait un pointeur de fonction àfunction1()
.A l'intérieur du champ d'
function2
, lorsqueint function1
est déclaré, les ombres 'function1
la variable' 'function1
le pointeur de fonction'.Lorsque
function1()
est appelée à l'intérieurfunction2()
, il est supposéfunction1
est la variable et donne une erreur.Ceci est corrigé en appelant
Base::function1();
à l'intérieur defunction2()
.
Ma question est la suivante: Pourquoi ne pas le compilateur donne une erreur lors de la déclaration int function1;
? Cela ne devrait-il pas être autorisé?
Vous avez presque raison, sauf qu'il n'y a pas de fonction * pointeurs * impliqués, seulement des fonctions. L'ombrage des noms est autorisé, ce qui explique pourquoi ce n'est pas une erreur. – molbdnilo
'-Wshadow', ou tout ce que votre compilateur appelle. – Biffen
Vous pouvez toujours déclarer n'importe quel nom dans une nouvelle portée, il cachera le même nom si ce nom existait déjà dans une portée externe –