将类的静态函数声明为友元

Declaring a static function of class as a friend

本文关键字:友元 声明 静态函数      更新时间:2023-10-16

我的问题是,根据我的理解,你必须在将函数声明为朋友之前转发声明或定义函数。以下方法是否有效?

template <typename> class class1;
template <typename T>
class class2 {
    ...
    friend void class1<T>::foo();
    ...
}
template <typename T>
class class1 {
    ...
    static void foo() {}
    ...
}

这里的问题是您无法转发声明静态函数foo。希望这概括了这个问题所需的一切。我尝试了这样的东西,它编译并工作正常,但我想知道这是否仍然有效,因为我也读到一些编译器接受没有以前正向声明的朋友声明,尽管这是编译器依赖的。

不管你喜不喜欢,将某物声明为朋友会在类之外创建前向声明。这是在标准中明确编写的,编译器支持这一点。

你的例子更复杂。您正在尝试使用前向声明内部的内容。好吧,智能编译器可以处理这个问题。所有编译器 - 我不太确定。第二点 - 您的好友声明在模板内。编译器仅部分分析模板。他们不能做得更好。所有替换和检查仅在实例化模板时发生。在这一点上,编译器知道的更多。在示例中,永远不会实例化class2

尝试在模板中写一些奇怪的东西,你会发现这将编译。然后添加实例化而不更改模板本身。编译器会给你错误。