当我尝试从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
答案 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::extractHistogram
是GHistogram
的朋友,但您声明了一个名为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()
{
}