Nomes e nomes qualificados
Os nomes usados com o operador de resolução de escopo binário (::) são chamados de "nomes qualificados". O nome especificado depois do operador de resolução de escopo deve ser membro da classe especificada à esquerda do operador ou membro de sua classe base.
Os nomes especificados após o operador de seleção de membro (. ou –>) devem ser membros do tipo de classe do objeto especificado à esquerda do operador ou membros de suas classes base. Os nomes especificados à direita do operador de seleção de membros (–>) também podem ser objetos de outro tipo de classe, contanto que o lado esquerdo de –> seja um objeto de classe e que a classe defina um operador de seleção de membro sobrecarregado (–>) que é avaliado em um ponteiro para qualquer outro tipo de classe. (Esse provisionamento é abordado em mais detalhes em Acesso de membros de classe.)
O compilador pesquisa por nomes na seguinte ordem, parando quando o nome é encontrado:
Escopo do bloco atual se o nome for usado em uma função; caso contrário, o escopo global.
Em recursos externos por cada escopo do bloco delimitador, incluindo o escopo da função externa (incluindo argumentos de função).
Se o nome for usado dentro de uma função de membro, o escopo da classe será pesquisado por nome.
As classes base da classe são pesquisadas sequencialmente pelo nome.
O escopo delimitador da classe aninhada (se houver) e suas bases são pesquisados. A pesquisa continua até que o escopo delimitador de classe externo ser pesquisado.
O escopo global é pesquisado.
No entanto, você pode modificar essa ordem de pesquisa como segue:
Os nomes precedidos por :: forçam a pesquisa a iniciar no escopo global.
Os nomes precedidos pelas palavras-chave class, struct e union forçam o compilador a pesquisar somente pelos nomes class, struct ou union.
Os nomes no lado esquerdo do operador de resolução de escopo (::) podem ser apenas nomes class, struct, namespace ou union.
Se o nome se refere a um membro não estático, mas é usado em uma função de membro estático, uma mensagem de erro é gerada. Da mesma forma, se o nome se referir a qualquer membro não estático em uma classe delimitadora, uma mensagem de erro será gerada, pois as classes incluídas não têm os ponteiros this da classe delimitadora.