我的问题出现了,因为根据我的理解,你必须在声明或定义函数之前将它们声明为朋友。以下是否有效?
template <typename> class class1;
template <typename T>
class class2 {
...
friend void class1<T>::foo();
...
}
template <typename T>
class class1 {
...
static void foo() {}
...
}
这里的问题是你无法转发声明静态函数foo
。希望这封装了这个问题所需的一切。我尝试了类似这样的东西,它编译并运行良好,但我想知道这是否仍然被认为是有效的,因为我也读了一些编译器接受朋友声明没有先前的前向声明,虽然这是编译器相关的。
答案 0 :(得分:1)
无论喜欢与否,将某事称为朋友会在课堂外创建前向声明。这是明确写在标准中的,编译器支持这个。
你的例子更复杂。您正在尝试使用前向声明中的内容。那么,智能编译器可以处理这个问题所有编译器 - 我不太确定。第二点 - 您的朋友声明在模板内。编译器仅部分解析模板。他们不能做得更好。只有在实例化模板时才会进行所有替换和检查。此时编译器知道的更多。在您的示例中,class2
永远不会被实例化。
尝试在模板中写一些奇怪的东西,你会发现这将编译。然后添加实例化而不更改模板本身。编译器会给你错误。