【发布时间】:2016-03-09 14:54:08
【问题描述】:
#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) 中,我使用 using 声明使名称 std::swap 可见。如果没有 using 声明,则无法编译代码,因为在类 H 中没有具有两个参数的可用交换函数。
我有一个问题。在我看来,在我使用了 using 声明 -- using std::swap 之后,它只是让 std::swap -- STL 中的模板函数可见。所以我认为应该在H::swap() 中调用STL 中的交换。但结果显示,void swap(H &t1, H &t2) 被调用了。
所以这是我的问题:
- 为什么我不能在没有 using 声明的情况下调用 swap?(我猜是因为类中没有带两个参数的 swap 函数。但我不确定。)
- 为什么会调用我定义的交换而不是
H::swap中的 STL 交换?
【问题讨论】:
-
您在问题中留下了很多不相关(分散注意力)的代码。请提供minimal reproducible example。
-
我会写一个答案,但我不确定参数相关查找的技术细节。不过,这应该是一个非常容易搜索的术语。 (您的怀疑 1 是正确的;当在类中找到名称时,重载解析不会冒险到类之外。)
-
@WingCuengRay 我删除了所有这些代码是有原因的——它与这个问题完全无关,也让人分心。您不需要任何构造函数或运算符来演示您遇到的问题。
标签: c++ swap using argument-dependent-lookup name-lookup