Essa pergunta me fez pensar se é útil / necessário qualificar totalmente os nomes de classe (incluindo o operador de escopo global) em uma definição de função de membro fora da classe.
Por um lado, nunca vi isso antes (e a sintaxe para fazê-lo corretamente parece obscura). Por outro lado, a pesquisa de nome C ++ é muito trivial, portanto, talvez exista uma caixa de canto.
Questão:
Existe algum caso em que a introdução de uma definição de função de membro fora da classe
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
seja diferente
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(sem ::
prefixo de escopo global )?
Observe que as definições de função de membro devem ser colocadas em um espaço para nome que encerra a classe, portanto este não é um exemplo válido.
Respostas:
Uma diretiva de uso pode fazer
Fully
com que seja ambígua sem qualificação.fonte
É necessário se alguém é masoquista e gosta de escrever coisas assim
É claro que se pode escrever a segunda sobrecarga como
foo::foo::bar::baz
no escopo global, mas a questão era se as duas declarações podem ou não ter um significado diferente. Eu não recomendaria escrever esse código.fonte
using
. É bom destacar diferentes casos!Se uma diretiva using for usada, pode haver um código confuso.
Considere o seguinte programa demonstrativo
Portanto, para facilitar a leitura, esse nome qualificado
mostra exatamente onde a função é declarada.
fonte