问题标签 [argument-dependent-lookup]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
18516 浏览

c++ - 重载左移运算符

我研究并发现,当您想为 cout 重载输出流运算符时,正确的方法是这样做:

这个函数必须在类之外定义,因为这里发生的事情是 operator<< 实际上是在 ostream 中定义的友元函数,而您正在使用它。但是,问题是,这个函数是如何在 ostream 中定义的?由于这个函数有 2 个参数,而第二个参数是用户定义的,所以他们无法猜测那里会发生什么。

特定类的重载应如下所示:

编译器/库如何对第二个参数进行泛型定义,特别是因为 C++ 中没有泛型类(例如 Java 中的 Object)?

0 投票
2 回答
100 浏览

c++ - 命名空间、类成员 ADL 冲突

有没有办法限定打印功能,以便打印基本成员和派生成员?我可以将两个友元函数移动到它们最近的封闭命名空间:

这有效,结果如下:

outside::A 42 outside::A 42 inside::A 24

可以通过朋友功能实现相同的功能吗?也许使用using

编辑:inside::A::print(std::ostream&)击败下面的静态演员建议,https ://stackoverflow.com/a/22585103/710408 。还有其他选择吗?

0 投票
2 回答
138 浏览

c++ - VC++ 2012:“使用参数相关查找找到”解决方法?

可能有人问过,但我对如何使这段代码与 VC 2012 一起工作很感兴趣:

我必须使用这个 ns 命名空间,并且不能更改它。它必须能够在没有 STL 的情况下工作,并且有自己的 swap()。但是,如何正确地将它与 STL 一起使用?

0 投票
2 回答
78 浏览

c++ - 顶级命名空间中类的参数依赖查找?

由于历史原因,我有一个位于顶级命名空间中的类。我需要为它定义一个必须使用参数相关查找找到1的函数。顶级名称空间是否被视为此类的关联名称空间,还是我必须采取一些解决方法?

1否则使用它的模板可能找不到它,因为在模板之后定义的符号只有在 ADL 找到时才能看到。

0 投票
3 回答
342 浏览

c++ - 构造函数初始化列表中的 ADL

如何在构造函数初始化列表中启用 ADL?例如,假设我有一个bignum具有命名空间级函数的abs函数。现在我想写一个类Foo,用传递给构造函数的实例的绝对值初始化它的成员;abs如果存在,它应该使用命名空间级别,std::abs否则:

无论如何,在类范围内都禁止使用声明,我不想“污染”命名空间。如何启用 ADL 以便它在构造函数初始化列表中工作?

0 投票
2 回答
180 浏览

c++ - 什么时候应用 ADL?

有3个例子:

我。

二、

三、

我不清楚 ADL 查找的实际条件是什么?我需要参考标准来描述它。

0 投票
1 回答
150 浏览

c# - 参数依赖查找的困惑?

我从这里举了下面的例子。

当我试图在 C++ 中找到扩展函数时,我遇到了这种情况。

上面的示例是否只是意味着,如果我调用具有第一个参数的任何函数作为任何类的对象,并且如果在当前命名空间中找不到该函数,那么编译器会在第一个对象的命名空间中找到所需的函数?

如果我错了,这个问题似乎无关紧要,但是C#中的扩展方法与ADL有关系吗?

0 投票
2 回答
154 浏览

c++ - 在全局范围内重载标准容器上的运算符是不好的风格吗?

我遇到了这个问题:



问题(如here所述)是因为隐藏而a += b;无法编译;而 ADL 没有找到,因为 ADL 只在这种情况下搜索。Bar::operator+=(Qux&, Qux const &)::operator+=::operator+namespace std;

这很棘手,因为问题仅在包含时才会出现B.h- 但B.h显然与Buffer. 代码不应该根据我是否包含另一个标题而中断。

(实际上我只是在更改编译器时才发现这一点,我使用的以前的编译器确实名称查找错误并接受了代码)。

我的问题是:A.h由于这个问题,过载只是一个坏主意吗?

我现在通过在里面B.h做来解决这个问题,但这似乎很hacky,有更好的选择吗?using ::operator+=;namespace Bar

0 投票
1 回答
164 浏览

c++ - 编译器无法通过 ADL 找到基类方法

这是怎么回事——为什么不能编译?

(MinGW 和 VC11 中的错误与No conversion from double to std::string.)

如果我在 中更改打印函数的名称Derived,它会成功编译,所以很明显Derived::print(string const &)是以某种方式屏蔽Base::print(double)。但我的印象是函数签名包括参数类型,所以这个掩码应该发生在这里。在基类方法的情况下这不正确吗?

0 投票
1 回答
519 浏览

c++ - 如何调用与成员函数同名的内联友元函数?

如此处所述,模板实例化类成员函数上的 C++11 样式 SFINAE 和函数可见性使自由函数黯然失色。使用完全限定的名称通常有效,但是我很难使用其他类的内联声明的友元函数。考虑以下示例:

我想我明白问题是什么,如此处所述内联友元函数的范围是什么?内联友元函数通常使用 ADL 找到,并且在封闭的命名空间中并不真正可见。

所以我的问题是我应该如何更改我的代码以使其正常工作(除了重命名 f 之一)?