为什么这个朋友的功能无法访问该类的私有成员?

Alc*_*sta 5 c++

当我尝试GHistogramextractHistogram()实现中访问类的bin私有成员时,我收到以下错误:

error: 'QVector<double> MyNamespace::GHistogram::bins' is private
error: within this context
Run Code Online (Sandbox Code Playgroud)

"在此上下文中"错误指向extractHistogram()实现的位置.有谁知道我朋友的功能声明有什么问题?

这是代码:

namespace MyNamespace{

class GHistogram
{

public:
    GHistogram(qint32 numberOfBins);
    qint32 getNumberOfBins();

    /**
     * Returns the frequency of the value i.
     */
    double getValueAt(qint32 i);
    friend GHistogram * MyNamespace::extractHistogram(GImage *image, 
                                                      qint32 numberOfBins);

private:
    QVector<double> bins;
};

GHistogram * extractHistogram(GImage * image, 
                              qint32 numberOfBins);

} // End of MyNamespace
Run Code Online (Sandbox Code Playgroud)

Ari*_*Ari 6

根据我的GCC,上面的代码没有编译,因为声明extractHistogram()出现在friend编辑它的类定义之后.编译器在friend语句上扼杀,说这extractHistogram既不是函数也不是数据成员.bins当我将声明移到类定义之前(并添加一个前向声明,class GHistogram;以便编译器知道返回类型)时,一切运行良好并且可以访问.当然,代码extractHistogram()应该写在命名空间内,或者通过

namesapce MyNameSpace {
// write the function here
}
Run Code Online (Sandbox Code Playgroud)

要么

GHistogram *MyNameSpace::extractHistogram( //....
Run Code Online (Sandbox Code Playgroud)