Noms et noms qualifiés
Les noms utilisés avec l'opérateur binaire de résolution de portée (::) sont appelés des noms qualifiés. Le nom spécifié après l'opérateur binaire de résolution de portée doit être membre de la classe spécifiée à gauche de l'opérateur ou membre d'une ou plusieurs de ses classes de base.
Les noms spécifiés après l'opérateur de sélection de membre (. ou –>) doivent être membres du type de classe de l'objet spécifié à gauche de l'opérateur ou membres d'une ou plusieurs de ses classes de base. Les noms spécifiés à droite de l'opérateur de sélection de membre (–>) peuvent également être des objets d'un autre type de classe si le côté gauche de –> est un objet classe et que la classe définit un opérateur de sélection de membre surchargé (–>) qui correspond à un pointeur vers un autre type de classe. (Cette disposition est décrite plus en détail dans Accès aux membres de classe.)
Le compilateur recherche les noms dans l'ordre suivant et s'arrête après avoir trouvé le nom :
Portée de bloc active si le nom est utilisé dans une fonction. Sinon, portée globale.
Vers l'extérieur dans chaque portée de bloc englobante, notamment la portée de fonction externe (qui inclut des arguments de fonction).
Si le nom est utilisé dans une fonction membre, il est recherché dans la portée de la classe.
Le nom est recherché dans les classes de base de la classe.
La recherche est effectuée dans la portée de classe imbriquée englobante (le cas échéant) et ses bases. La recherche se poursuit jusqu'à atteindre la portée de classe englobante externe.
La recherche est effectuée dans la portée globale.
Toutefois, vous pouvez apporter des modifications à cet ordre de recherche comme suit :
Les noms précédés de :: forcent la recherche à commencer au niveau de la portée globale.
Les noms précédés des mots clés class, struct et union forcent le compilateur à rechercher uniquement les noms class, struct ou union.
Les noms à gauche de l'opérateur de résolution de portée (::) peuvent être uniquement des noms class, struct, namespace ou union.
Si le nom fait référence à un membre non statique mais est utilisé dans une fonction membre statique, un message d'erreur est généré. De même, si le nom fait référence à un membre non statique d'une classe englobante, un message d'erreur est généré car les classes englobées n'ont pas de pointeurs this de classe englobante.