Buscar..


Que funciones se encuentran

Las funciones se encuentran al recopilar primero un conjunto de "clases asociadas" y "espacios de nombres asociados" que incluyen uno o más de los siguientes, según el tipo de argumento T Primero, mostremos las reglas para los nombres de especialización de clases, enumeración y de plantilla de clase.

  • Si T es una clase anidada, enumeración de miembros, entonces la clase circundante.
  • Si T es una enumeración (que también puede ser un miembro de la clase!), El espacio de nombres más interna de la misma.
  • Si T es una clase (que también se pueden anidar!), Todas sus clases base y la propia clase. El espacio de nombres más interno de todas las clases asociadas.
  • Si T es un ClassTemplate<TemplateArguments> (¡esto también es una clase!), Las clases y los espacios de nombres asociados con los argumentos de tipo de plantilla, el espacio de nombres de cualquier argumento de plantilla de plantilla y la clase circundante de cualquier argumento de plantilla de plantilla, si un argumento de plantilla es una plantilla de miembro.

Ahora hay algunas reglas para los tipos incorporados también

  • Si T es un puntero a U o matriz de U , las clases y los espacios de nombres asociados con U Ejemplo: void (*fptr)(A); f(fptr); , incluye los espacios de nombres y las clases asociadas con void(A) (ver la siguiente regla).
  • Si T es un tipo de función, las clases y los espacios de nombres asociados con los tipos de parámetros y de retorno. Ejemplo: void(A) incluiría los espacios de nombres y las clases asociadas con A
  • Si T es un puntero a miembro, las clases y los espacios de nombres asociados con el tipo de miembro (pueden aplicarse tanto a puntero a funciones de miembro como puntero a miembro de datos). Ejemplo: BA::*p; void (A::*pf)(B); f(p); f(pf); incluye los espacios de nombres y las clases asociadas con A , B , void(B) (que aplica la viñeta anterior para los tipos de función).

Todas las funciones y plantillas dentro de todos los espacios de nombres asociados se encuentran por búsqueda dependiente del argumento. Además, se encuentran funciones de amigo en el ámbito del espacio de nombres declaradas en clases asociadas , que normalmente no son visibles. Sin embargo, se ignoran las directivas de uso.

Todas las siguientes llamadas de ejemplo son válidas, sin calificar f por el nombre del espacio de nombres en la llamada.

namespace A {
   struct Z { };
   namespace I { void g(Z); }
   using namespace I;

   struct X { struct Y { }; friend void f(Y) { } };
   void f(X p) { }
   void f(std::shared_ptr<X> p) { }
}

// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());

g(A::Z()); // invalid: "using namespace I;" is ignored!


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow