Plantillas y resolución de nombres

En las definiciones de plantilla, hay tres tipos de nombres.

  • Nombres declarados localmente, como el nombre de la propia plantilla y cualquier nombre declarado dentro de la definición de plantilla.

  • Nombres del ámbito de inclusión fuera de la definición de plantilla.

  • Nombres que dependen de alguna manera de los argumentos de plantilla, denominados nombres dependientes.

Mientras que los dos primeros nombres pertenecen también a ámbitos de clase y función, en las definiciones de plantillas se requieren reglas especiales de resolución de nombres para tratar la complejidad agregada de los nombres dependientes. Esto se debe a que el compilador apenas tiene conocimiento de estos nombres hasta que se crea una instancia de la plantilla, ya que pueden ser tipos totalmente diferentes en función de los argumentos de plantilla que se usen. Los nombres no dependientes se buscan de acuerdo con las reglas habituales y en el punto de definición de la plantilla. Estos nombres, que son independientes de los argumentos de plantilla, se buscan una sola vez para todas las especializaciones de plantilla. Los nombres dependientes no se buscan hasta que se crea una instancia de la plantilla y se buscan por separado para cada especialización.

Un tipo es dependiente si depende de los argumentos de plantilla. En concreto, un tipo es dependiente si es:

  • El propio argumento de plantilla:

    T
    
  • Un nombre completo con una clasificación que incluye un tipo dependiente:

    T::myType
    
  • Un nombre completo si la parte incompleta identifica un tipo dependiente:

    N::T
    
  • Un tipo const o volatile para el que el tipo base es un tipo dependiente:

    const T
    
  • Un tipo de puntero, referencia, matriz o puntero de función basado en un tipo dependiente:

    T *, T &, T [10], T (*)()
    
  • Una matriz cuyo tamaño se basa en un parámetro de plantilla:

    template <int arg> class X {
    int x[arg] ; // dependent type
    }
    
  • Un tipo de plantilla creado a partir de un parámetro de plantilla:

    T<int>, MyTemplate<T>
    

Dependencia de tipos y dependencia de valores

Los nombres y las expresiones dependientes de un parámetro de plantilla se clasifican como dependientes del tipo o dependientes del valor, en función de si el parámetro de plantilla es un parámetro de tipo o un parámetro de valor. Además, los identificadores declarados en una plantilla con un tipo dependiente del argumento de plantilla se consideran dependientes del valor, ya que es un tipo entero o de enumeración inicializado con una expresión dependiente del valor.

Las expresiones dependientes del tipo y dependientes del valor son expresiones que implican variables dependientes del tipo o dependientes del valor. Estas expresiones pueden tener una semántica diferente en función de los parámetros utilizados para la plantilla.

Consulte también

Templates (Plantillas [C++])