Ocultar o nome usando a declaração
#include <iostream>
struct H
{
void swap(H &rhs);
};
void swap(H &, H &)
{
std::cout << "swap(H &t1, H &t2)" << std::endl;
}
void H::swap(H &rhs)
{
using std::swap;
swap(*this, rhs);
}
int main(void)
{
H a;
H b;
a.swap(b);
}
E este é o resultado:
swap(H &t1, H &t2)
No código acima, tento definir uma função de troca deH
. Na funçãovoid H::swap(H &rhs)
, Uso uma declaração using para tornar visível o nome std :: swap. Se não houver uma declaração de uso, o código não poderá ser compilado porque não há função de troca utilizável com dois parâmetros na classeH
.
Eu tenho uma pergunta aqui. Na minha opinião, depois de usar a declaração using -using std::swap
, apenas torna visível a função std :: swap - o modelo no STL. Por isso, pensei que a troca no STL deveria ser chamada emH::swap()
. Mas o resultado mostrou que ovoid swap(H &t1, H &t2)
foi invocado em seu lugar.
Então aqui está a minha pergunta:
Por que não consigo invocar a troca sem uma declaração de uso? (acho que é porque não há função de troca com dois parâmetros na classe. Mas não tenho certeza.)Por que a troca da minha definição será invocada em vez da troca STL noH::swap
?