问题标签 [non-member-functions]

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 投票
1 回答
222 浏览

c++ - c++ 中朋友的非常规用法

我知道关键字在封装方面的一般用例,friend但有几次,我需要friend关键字只是为了“完成工作”。这些用例并不让我高兴,所以我想知道是否有其他选择。这是第一个最小的示例:

在构造函数声明中给出默认值之前,编译器有什么方法可以在接口内部查看嵌套类声明operator|Foo

我有时也会发现自己friend在定义模板中嵌套类的对称操作时使用了关键字。例如:

从封装的角度来看,operator==它不需要友谊。但由于operator==实际上不是模板化函数,并且编译器无法推断模板中嵌套类的类型,这似乎是operator==作为自由函数保留的唯一合理“技巧”。

正如我所说,这些选择确实有效,但我想知道是否有更好的选择/实践。

0 投票
0 回答
63 浏览

c++ - 有没有办法让 Visual Studio 找到/提供将特定类型作为参数的函数?

假设我为 type 实现了一些功能Foo。如果它们是成员函数,VS 将为foo对象提供它们,但如果我将它们实现为免费/非成员函数,那么我将得不到任何帮助。

如果它像那么常见normalize(some_vector)那么没关系,但否则我必须搜索功能。使用许多免费功能的人通常如何解决这个问题?有解决方法吗?将这些函数放入描述性命名空间是个好主意吗?FooFunctions::doSomething(foo);

0 投票
0 回答
27 浏览

c++ - c ++非成员函数的赋值运算符重载

我有一个变量类,我用它来使我的程序中的脚本编写更容易。我正在尝试找出一种简单的方法来执行以下操作:

当我使用非成员函数重载运算符时,例如:

在尝试使用非成员函数重载赋值运算符之前,我没有任何问题。

这会产生错误并且不会编译。错误 C4430:缺少类型说明符 - 假定为 int。errir C2801 'operator =' 必须是非静态成员。

我只是希望能够完成以下工作:

我怎样才能做到这一点。我有几千万行代码,我只想用 myclass 替换简单的 int,但不想编辑这个变量的每次使用。

注意:已编辑以添加错误消息。

最终编辑:找到解决方案:

通过添加重载运算符,我无需将赋值运算符重载为非成员函数。

0 投票
1 回答
31 浏览

c++ - 为什么依赖于参数的查找(ADL)选择类方法而不是更合适的自由函数?

根据cppreference,在Argument-dependent查找

除了通常的非限定名称查找所考虑的范围和名称空间之外,还在其参数的名称空间中查找函数名称。

但是,为什么在下面的函数 A::member_function() 示例中,选择了类方法begin(),其中 1) 采用 0 个参数,而 2) 甚至不在 std::vector 的命名空间中,函数的参数?ADL 不应该转到参数的命名空间(对于向量来说是 std)并选择自由函数 std::begin() 吗?

如果这真的是 ADL 的工作方式,我也很高兴有一个解决方法。