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

时间:2015-01-24 22:50:19

标签: c++ friend

我的问题出现了,因为根据我的理解,你必须在声明或定义函数之前将它们声明为朋友。以下是否有效?

template <typename> class class1;

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

template <typename T>
class class1 {
    ...
    static void foo() {}
    ...
}

这里的问题是你无法转发声明静态函数foo。希望这封装了这个问题所需的一切。我尝试了类似这样的东西,它编译并运行良好,但我想知道这是否仍然被认为是有效的,因为我也读了一些编译器接受朋友声明没有先前的前向声明,虽然这是编译器相关的。

1 个答案:

答案 0 :(得分:1)

无论喜欢与否,将某事称为朋友会在课堂外创建前向声明。这是明确写在标准中的,编译器支持这个。

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

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