将类的静态函数声明为友元
Declaring a static function of class as a friend
我的问题是,根据我的理解,你必须在将函数声明为朋友之前转发声明或定义函数。以下方法是否有效?
template <typename> class class1;
template <typename T>
class class2 {
...
friend void class1<T>::foo();
...
}
template <typename T>
class class1 {
...
static void foo() {}
...
}
这里的问题是您无法转发声明静态函数foo
。希望这概括了这个问题所需的一切。我尝试了这样的东西,它编译并工作正常,但我想知道这是否仍然有效,因为我也读到一些编译器接受没有以前正向声明的朋友声明,尽管这是编译器依赖的。
不管你喜不喜欢,将某物声明为朋友会在类之外创建前向声明。这是在标准中明确编写的,编译器支持这一点。
你的例子更复杂。您正在尝试使用前向声明内部的内容。好吧,智能编译器可以处理这个问题。所有编译器 - 我不太确定。第二点 - 您的好友声明在模板内。编译器仅部分分析模板。他们不能做得更好。所有替换和检查仅在实例化模板时发生。在这一点上,编译器知道的更多。在示例中,永远不会实例化class2
。
尝试在模板中写一些奇怪的东西,你会发现这将编译。然后添加实例化而不更改模板本身。编译器会给你错误。
相关文章:
- 如何在嵌套类中正确使用友元声明?
- 类模板中文本运算符的友元声明
- 模板和隐式构造函数的类定义之外的友元声明
- 如何将友元声明用于具有约束的模板类
- 模板化友元声明在 G++ 5.4.0 下不起作用 - 编译器错误或错误代码
- 友元声明阻止外部函数访问类的私有部分
- C++:友元声明'声明一个非模板函数
- 友元声明及其表示的实体
- 嵌套类中需要前向声明的友元声明
- 多参数模板不能很好地处理友元声明
- 友元声明和显式模板实例化声明
- 为什么标准禁止部分专门化的友元声明
- is_constructible和is_destructibble不受友元声明的影响
- Pimpl习语和内部对象协作,无需友元声明
- C++中的友元声明-公共和私有之间的区别
- 单个成员而不是整个类的友元声明
- 关于 C++ 中友元声明的基本内容错误
- 有没有办法避免模板友元声明的外部可见性
- 如何解决c++中友元声明的循环依赖
- 指定默认实参的友元声明必须是定义