2016-01-19 3 views
3

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:

  1. Lorsque function1 est appelé par lui-même en dehors de function2(), il est en fait un pointeur de fonction à function1().

  2. A l'intérieur du champ d'function2, lorsque int function1 est déclaré, les ombres 'function1 la variable' 'function1 le pointeur de fonction'.

  3. Lorsque function1() est appelée à l'intérieur function2(), il est supposé function1 est la variable et donne une erreur.

  4. Ceci est corrigé en appelant Base::function1(); à l'intérieur de function2().

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é?

+2

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

+1

'-Wshadow', ou tout ce que votre compilateur appelle. – Biffen

+2

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 –

Répondre

7

La variable locale remplace la désignation de la méthode dans le bloc local. Essayez this->function1() pour l'appeler quand même.

Ou mieux encore, renommez l'un ou l'autre pour aider les gens à lire votre code en évitant toute confusion (et cela inclut votre avenir vous-même).

+0

Merci pour votre réponse! N'hésitez pas à [edit] (http://stackoverflow.com/posts/34887104/edit) votre commentaire dans votre réponse – Tas

+0

Merci. Il semblait juste non intuitif que l'erreur se soit produite là où elle s'est produite. –

1

Pour répondre à votre question: « Faut-il être permis »:

En C++, vous pouvez avoir différentes entités du même nom si elles existent dans différents domaines (comme dans votre exemple). C'est une fonctionnalité très utile en général, car elle vous permet d'utiliser les noms que vous voulez pour vos entités en supposant que vous les fournissez par exemple. dans l'espace de noms. Dit que, le compilateur a besoin d'un algorithme pour sélectionner l'entité quand il voit le nom dans le code. En C++, le processus standard de correspondance du nom à la déclaration est appelé "recherche de nom". Vous pouvez voir la description de cet algorithme, par ex. ici cppreference ou directement dans le projet standard.