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?

questionAnswers(1)

yourAnswerToTheQuestion