Сокрытие имени с помощью объявления
#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);
}
И вот результат:
swap(H &t1, H &t2)
В приведенном выше коде я пытаюсь определить функцию подкачкиH
, В функцииvoid H::swap(H &rhs)
Я использую объявление использования, чтобы сделать имя std :: swap видимым. Если нет объявления об использовании, код не может быть скомпилирован, потому что в классе нет полезной функции подкачки с двумя параметрамиH
.
У меня есть вопрос здесь. На мой взгляд, после того, как я использовал объявление об использовании -using std::swap
это просто делает std :: swap - функцию шаблона в STL видимой. Поэтому я подумал, что своп в STL должен быть вызван вH::swap()
, Но результат показал, чтоvoid swap(H &t1, H &t2)
был вызван вместо
Вот мой вопрос:
Почему я не могу вызвать swap без объявления использования I (я думаю, это потому, что в классе нет функции swap с двумя параметрами. Но я не уверен.)Почему будет использоваться обмен моего определения вместо обмена STL вH::swap
?