Um ponto do ISO C ++ DRAFT n3290: pesquisa de nome dependente de argumento: seção 3.4.2, parágrafo 2,
Para cada argumento, digite T na chamada de função,existe um conjunto de zero ou mais namespaces associados e um conjunto de zero ou mais classes associadas a serem considerado. Os conjuntos de namespaces e classes são determinados inteiramente pelo tipos dos argumentos da função (e o espaço para nome de qualquer modelo de modelo Os nomes de tipos e declarações de uso são usados para especificar os tipos não contribuir para este conjunto. Os conjuntos de namespaces e classes são determinados Da seguinte maneira:
- Se T é um tipo fundamental, seus conjuntos associados de namespace e classes são ambos vazios.
- Se T é um tipo de classe (incluindo sindicatos), seuclasses associadas são: a classe em si; a classe da qual é membro, se houver; e sua direta e indireta classes base. Seus namespaces associados são os namespaces dos quais seus classes associadas são membros.
Além disso, se T é um modelo de classe especialização, suanamespaces e classes associados também incluem: o namespaces e classes associados aos tipos dos argumentos do modelo fornecido para parâmetros de tipo de modelo (excluindo parâmetros de modelo); os espaços para nome dos quais qualquer argumento de modelo de modelo é membro; e a classes das quais qualquer modelo de membro usado como argumento de modelo é
membros.[ Nota: Os argumentos de modelo não-tipo não contribuem para o conjunto de um namespaces associados. - nota final]
Alguém pode por favor expalin isso em termos de um exemplo ... por favor
aqui na declaração acima "conjuntos de namespaces e classes estão vazios" .. como isso é possível?
E no segundo ponto ele disse o quanto mais ... por favor, alguém pode explicar isso?
Respostas:
6 para resposta № 1Os tipos fundamentais, como int
e char
, não estão definidos em nenhum espaço de nome ou classe. É por isso que a lista de associações deles estará vazia.
Se os parâmetros de função forem tipos criados a partir de um modelo, não apenas o espaço para nome desse modelo será considerado, mas também os espaços para nome dos parâmetros do modelo. Por exemplo, se você tiver um std::vector<foo::bar>
como parâmetro, o conjunto de namespaces incluirá ambos std
e foo
.