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

时间:2010-03-23 14:29:51

标签: c++

当我尝试从GHistogram实现中访问extractHistogram()类的bin私有成员时出现以下错误:

error: 'QVector<double> MyNamespace::GHistogram::bins' is private
error: within this context

“在此上下文中”错误指向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

4 个答案:

答案 0 :(得分:6)

根据我的GCC,上面的代码无法编译,因为extractHistogram()的声明出现在friend编辑的类定义之后。编译器在friend语句中扼流,说extractHistogram既不是函数也不是数据成员。一切正常,当我将声明移到类定义之前时,可以访问bins(并添加一个前向声明class GHistogram;,以便编译器知道返回类型)。当然,extractHistogram()的代码应该通过

写在命名空间内
namesapce MyNameSpace {
// write the function here
}

GHistogram *MyNameSpace::extractHistogram( //....

答案 1 :(得分:2)

尝试:

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

答案 2 :(得分:1)

您声明Gbdi::extractHistogramGHistogram的朋友,但您声明了一个名为extractHistogram函数并希望它与GHistogram的朋友联系。 extractHistogram应该是Gbdi的成员。

答案 3 :(得分:1)

我猜你的意思是:

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

这可能不是原因,而是建议:

还有一件事,如果它是类的朋友并且你已经在类中声明了它,则不需要在类中声明一个函数。

换句话说:

//Your.h
class Foo
{
friend void m();
}
void m(); //This is totally unnecessary

//Your.cpp
void m()
{
}