2010-03-23 127 views
5

我收到以下錯誤,當我嘗試從extractHistogram()執行中訪問箱的GHistogram類的私有成員:爲什麼這個朋友功能無法訪問班級的私人成員?

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 
+2

是'Gbdi'類或命名空間?你有'Gbdi :: extractHistogram'作爲朋友。 – quamrana 2010-03-23 14:32:11

+0

對不起,用MyNamespace替換Gbdi。 GBDI是我工作的研究組的名稱... – 2010-03-23 14:36:37

回答

5

根據我的GCC上面的代碼不編譯因爲extractHistogram()聲明的類定義,它是friend版後出現。編譯器在friend聲明中扼殺,聲稱extractHistogram既不是函數也不是數據成員。當我將聲明移到類定義之前(並且添加前向聲明class GHistogram;,以便編譯器知道返回類型),所有代碼都可以正常工作,並且可以訪問bins。當然對於extractHistogram()代碼應該命名空間裏寫的,或者通過

namesapce MyNameSpace { 
// write the function here 
} 

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

謝謝!我曾嘗試在類聲明之前聲明extractHistogram(),但它沒有工作,因爲它在函數實現中缺少名稱空間範圍 - 我努力只使用'using namespace'子句... – 2010-03-23 15:57:22

1

您聲明Gbdi::extractHistogram成爲朋友GHistogram,但你聲明功能命名extractHistogram並期待它的朋友與GHistogramextractHistogram應該是Gbdi的成員。

+0

對不起,我的錯誤。代碼中正確的是MyNamespace而不是Gbdi。 – 2010-03-23 14:41:52

2

儘量只:

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

對不起,我的錯誤。正確的是MyNamespace而不是Gbdi int代碼。當我刪除MyNamespace時,我得到相同的錯誤。 – 2010-03-23 14:39:30

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() 
{ 
} 
+0

但是,如果我這樣做,當我嘗試從'main.cpp'中的int main()調用m()時,我將得到一個錯誤,告訴我'm()沒有在此範圍內聲明「,即使我在'main.cpp'中包含'Your.h'。 – 2010-03-23 14:47:08

+0

你是完全正確的。它下滑了我的想法,因爲我通常不這麼做。我會刪除它。抱歉。 – Anzurio 2010-03-23 14:48:17

相關問題