问题标签 [friend-function]

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 回答
18840 浏览

c++ - 模板类的模板友元函数

我一直在努力解决这个问题中描述的问题(将模板函数声明为模板类的朋友),我相信第二个答案是我想要做的(转发声明模板函数,然后将专业化命名为朋友)。我有一个问题,一个稍微不同的解决方案实际上是正确的还是恰好在 Visual C++ 2008 中工作。

测试代码为:

首先,我发现的一件奇怪的事情是,如果我更改了 的前向声明operator<<使其不匹配(例如,std::ostream& operator<<(std::ostream &out, int fake);,一切仍然编译并正常工作(要清楚,我不需要定义这样的函数,只声明它)。但是,与链接到的问题一样,删除前向声明会导致问题,因为编译器似乎认为我声明的是数据成员而不是友元函数。我很确定这种行为是一个 Visual C++ 2008 错误。

有趣的是,当我在上面的代码中删除前向声明并使用替代朋友声明时。请注意,模板参数U不会出现在以下签名中。此方法也可以正确编译和工作(无需更改任何其他内容)。我的问题是这是否符合标准或 Visual C++ 2008 的特性(我在参考书中找不到好的答案)。

请注意,虽然朋友声明template <typename U> friend ... const test<U> &t);也有效,但这实际上使运算符的每个实例都friend可以访问 的任何实例test,而我想要的是test<T>只能从operator<< <T>. test<int>我通过在内部实例化operator<<并访问私有成员来测试这一点;当我尝试输出test<double>.

概要:在上面的代码中删除前向声明并切换到替代朋友声明似乎会产生相同的结果(在 Visual C++ 2008 中)——这段代码真的正确吗?

更新:上述对代码的任何修改在 gcc 下都不起作用,所以我猜这些是 Visual C++ 编译器中的错误或“功能”。我仍然希望熟悉该标准的人提供见解。

0 投票
1 回答
867 浏览

c++ - 如何只为一个特定的函数和类声明友元函数?

我的代码有什么问题?

我尝试在 GNU G++ 环境中编译以下代码,但出现以下错误:

0 投票
1 回答
1378 浏览

c++ - 链接到朋友功能时出错

我有一个成功编译的类'Vector3' 。它包含非友元和友元函数,例如,当 Vector3 是第二个操作数时,重载 * 和 << 运算符。问题是我无法链接到任何友元函数,无论是否运算符重载。所以我可以确认该错误并非特定于运算符重载。用于链接的g++命令如下(另请参见最后的Makefile),

这给出了以下错误,

以下是我的源文件中的相关代码。我遵循为每个班级制作单独的 .hpp 和 .cpp 的做法。

最后,这是我的 Makefile。

最奇怪的是,如果我在 main.cpp 中也包含 Vector3.cpp 文件,然后在 Makefile 中从 OBJS 中删除 Vector3.o,则程序链接成功。我无法理解这一点。请帮我!!

0 投票
2 回答
648 浏览

c++ - 模板定义中的友元函数

我的问题与这个有点相关。

我想为某些类重载运算符 << ,我发现两种不同的符号都可以工作:

我是否用不同的符号定义相同的事物?或者第一个版本在<<的哪个实例(在这种情况下只有与我的类A具有相同T的实例)是A的朋友时更具限制性?

0 投票
15 回答
25935 浏览

c++ - 你会在哪里使用友元函数与静态成员函数?

当我们希望非成员函数访问该类的私有成员时,我们将其设为类的朋友。这赋予它与静态成员函数相同的访问权限。这两种选择都会为您提供一个与该类的任何实例都不相关的函数。

我们什么时候必须使用朋友功能?我们什么时候必须使用静态函数?如果两者都是解决问题的可行选择,我们如何衡量它们的适用性?默认情况下应该首选一个吗?

例如,当实现一个创建foo只有一个私有构造函数的类实例的工厂时,该工厂函数应该是foo(你会调用foo::create())的静态成员还是应该是友元函数(你会调用create_foo())?

0 投票
5 回答
909 浏览

c++ - 如何在模板类中拆分模板友元函数的定义?

下面的例子编译得很好,但我不知道如何分离 operator<<() 的声明和定义是这种特殊情况。

每次我尝试拆分定义时,朋友都会造成麻烦,而 gcc 抱怨 operator<<() 定义必须只采用一个参数。

Operator<<() 应该有一个免费的第一个参数来处理不同类型的输出流(std::cout、std::wcout 或 boost::asio::ip::tcp::iostream)。第二个参数应该绑定到周围类的特殊版本。

除此之外,使用非成员函数并不等同于拆分定义和声明,因为非成员函数无法访问类的私有属性。

0 投票
1 回答
889 浏览

c++ - 在 Visual Studio 2008 下声明“朋友”函数失败

我试图将一个全局函数声明为一个类的“朋友”:

当我在 Visual C++ 2008 下编译这段代码时,我得到:

如果我template <typename T> friend T first::FirstMethod();改用,我会得到:

声明友元函数的适当方式是什么?

0 投票
3 回答
6478 浏览

c++ - 使用友元函数的前向声明:不完整类型的无效使用

尝试编译此代码时,发生了一些错误。例如

不完整类型的无效使用

这段代码有什么问题?

0 投票
1 回答
1379 浏览

c++ - ADL 和朋友注入

考虑这段代码:

编译器似乎非常不同意。(MSVC08/10 说不,GCC<4.5 说是,但是 4.5 说不,sun 5.1 说是,intel 11.1 也说是,但是 comeau 说不(两者都是 EDG))。

根据“C++ 模板 - 完整指南”:

...假设涉及在关联类中查找朋友的调用实际上会导致该类被实例化...尽管这显然是编写 C++ 标准的人想要的,但标准中并未明确说明。

我在标准中找不到相关部分。有什么参考吗?

考虑这种变化:

这里的关键问题是在 ADL 期间注入的可行函数是否X<1>应该可见X<0>?它们有关联吗?上面提到的所有编译器都接受这个代码,除了 Comeau,它只在宽松模式下接受它。也不确定标准对此有何规定。

你对此有何看法?

0 投票
1 回答
2054 浏览

c++ - 好友功能无法识别

我有以下带有几个朋友功能的课程:

当我将最后一个函数作为朋友函数放入类中时,如下所示:

overlapT was not declared in this scope该代码在 main.cpp 中产生一个额外的错误。至于其他重叠函数(在其他文件中重载),当它们是类中的友元函数时,我会遇到类似的错误:error: no matching function for call to 'overlap()'. 我在另一个文件中以我认为相同的方式使用了友元函数,并且没有编译器错误。什么可能导致这个奇怪的错误?

好的,有一个小程序可以说明这个错误!

主文件

传送.h

传送.cpp

编译错误:

我怀疑静态变量可能与此有关,因为我的其他没有静态变量的类工作得很好。

编辑:实际上,静态变量似乎不是问题。我刚刚从 Teleport 类定义中删除了static关键字/不管它叫什么?,并注释掉了bool Teleport::veracity;;尽管如此,我仍然得到两个错误