Modelos e resolução de nomes
Nas definições de modelo, existem três tipos de nomes.
Declarada localmente nomes, incluindo o nome do modelo e todos os nomes declarados dentro da definição do modelo.
Nomes do escopo delimitador fora da definição do modelo.
Nomes que dependem de alguma forma os argumentos de modelo, conhecido como nomes de dependentes.
Enquanto os dois primeiros nomes também pertencem a classe e a função de escopos, regras especiais para a resolução de nomes são necessários em definições de modelo para lidar com a complexidade adicional de nomes dependentes.Isso ocorre porque o compilador sabe pouco sobre esses nomes até que o modelo é instanciado, porque poderiam ser totalmente diferentes tipos, dependendo de qual modelo argumentos são usados.Nomes independentes são pesquisados de acordo com as regras normais e no momento da definição do modelo.Esses nomes, sendo independente dos argumentos de modelo, são pesquisados de uma vez para todas as especializações do modelo.Nomes de dependentes não serão examinados até que o modelo é instanciado e são pesquisados separadamente para cada especialização.
Um tipo é dependente se ele varia de acordo com os argumentos de modelo.Especificamente, um tipo é dependente se ela for:
O modelo próprio argumento:
T
Um nome qualificado com uma qualificação, incluindo o tipo de dependente:
T::myType
Um nome qualificado se a parte não qualificada identifica um tipo de dependente:
N::T
Uma const ou volátil tipo para o qual o tipo base é um tipo de dependente:
const T
Um ponteiro, referência, matriz ou tipo de ponteiro de função com base em um tipo de dependente:
T *, T &, T [10], T (*)()
Uma matriz cujo tamanho se baseia em um parâmetro de modelo:
template <int arg> class X { int x[arg] ; // dependent type }
um tipo de modelo construído a partir de um parâmetro de modelo:
T<int>, MyTemplate<T>
Dependência de tipo e a dependência de valor
Nomes e expressões dependentes de um parâmetro de modelo são categorizadas como dependentes do tipo ou valor dependente, dependendo se o parâmetro do modelo é um parâmetro de tipo ou um parâmetro de valor.Além disso, qualquer identificadores declarados em um modelo com um tipo de acordo com o argumento de modelo são considerados valor dependentes, como é um tipo integral ou enumeração inicializado com uma expressão de valor dependente.
Expressões de dependentes do tipo e valor dependente são aquelas que envolvem variáveis que são dependentes do tipo ou valor dependente.Essas expressões podem ter semântica que diferem, dependendo dos parâmetros usados para o modelo.