Esta pregunta me hizo preguntarme si alguna vez es útil / necesario calificar completamente los nombres de clase (incluido el operador de alcance global) en una definición de función de miembro fuera de clase.
Por un lado, nunca había visto esto antes (y la sintaxis para hacerlo correctamente parece oscura). Por otro lado, la búsqueda de nombres en C ++ no es muy trivial, por lo que tal vez exista un caso de esquina.
Pregunta:
¿Hay algún caso en el que la introducción de una definición de función miembro fuera de clase
ReturnType (::Fully::Qualified::Class::Name::MemberFunctionName)(...) { ... }
difiera de
ReturnType Fully::Qualified::Class::Name::MemberFunctionName(...) { ... }
(sin ::
prefijo de alcance global )?
Tenga en cuenta que las definiciones de funciones miembro deben colocarse en un espacio de nombres que encierra la clase, por lo que este no es un ejemplo válido.
Respuestas:
Una directiva de uso puede hacer
Fully
que sea ambigua sin calificación.fuente
Es necesario si uno es masoquista y le gusta escribir cosas como esta
Por supuesto, se puede escribir la segunda sobrecarga como
foo::foo::bar::baz
en el ámbito global, pero la pregunta era si las dos declaraciones pueden tener un significado diferente. No recomendaría escribir ese código.fuente
using
. ¡Es bueno tener diferentes casos resaltados!Si se usa una directiva using, puede haber un código confuso.
Considere el siguiente programa demostrativo
Entonces, para facilitar la lectura, este nombre calificado
muestra con precisión dónde se declara la función.
fuente