2010-03-23 16 views
5

Ben extractHistogram() uygulanması içinden GHistogram sınıfının selelerini özel üyesini erişmeye çalıştığınızda aşağıdaki hatayı alıyorum: extractHistogram() uygulanmasınaBu arkadaş işlevi sınıfın özel bir üyesine neden erişemiyor?

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

nerede bu bağlamda 'hata noktalarını. Arkadaşımın işlev beyanı ile ilgili yanlış olanı bilen var mı?

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

tarafından, isim alanı içinde yazılmalıdır mı? Arkadaşın Gbdi :: extractHistogram' var. – quamrana

+0

Üzgünüz, Gbdi'yi MyNamespace ile değiştirin. GBDI çalıştığım araştırma grubunun adıdır ... –

cevap

5

: Başka bir deyişle

. Derleyici, extractHistogram'un bir işlev ya da veri üyesi olmadığını söyleyerek friend ifadesinde boğulmaktadır. Tümü iyi çalışıyor ve bildirimi sınıf tanımından önce taşıdığımda (ve döndürme türünün derleyici tarafından bilinmesi için ileri bildirim class GHistogram; ekleyin) bins erişilebilir. `Gbdi` bir sınıf veya ad alanı Tabii extractHistogram() için kod ya

namesapce MyNameSpace { 
// write the function here 
} 

veya

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

Teşekkür ederiz! Sınıf bildiriminden önce extractHistogram() 'ı bildirmeye çalışmıştım, ancak fonksiyon uygulamasındaki ad alanı kapsamını kaçırdığı için işe yaramadı - sadece' namespace 'kullanarak kullanmak zorunda kaldım. –

1

Sen GHistogram bir arkadaşı olmak Gbdi::extractHistogram beyan, ancak extractHistogram adında bir fonksiyonunu beyan ve GHistogram ile arkadaşınıza bekliyoruz:

İşte kod. extractHistogram, Gbdi'un bir üyesi olmalıdır.

+0

Hatam için özür dilerim. Doğru, kodda Gbdi yerine MyNamespace'dir. –

2

sadece deneyin:

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

Hatam için özür dilerim. Doğru, Gbdi int kodunun yerine MyNamespace'tir. MyNamespace'i kaldırdığımda aynı hatayı alıyorum. –

1

Ne demek sanırım:

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

Bu muhtemelen nedeni ancak bir öneridir:

Bir şey daha, değil mi Eğer bir sınıfın arkadaşıysa ve sınıf içinde zaten beyan etmişseniz, bir sınıfın dışında bir işlev beyan etmeniz gerekir. Benim GCC extractHistogram() beyanı o friend ed olduğu sınıf tanımının sonra görünür, çünkü Yukarıdaki kod derleme değil göre

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

//Your.cpp 
void m() 
{ 
} 
+0

Ama eğer bunu yaparsam, m() 'den int main()' main.cpp 'ifadesini çağırmaya çalıştığımda,' m() 'in bu kapsamda bildirilmediğini söyleyen bir hata alıyorum. 'Ana.cpp'imde' Your.h 'ifadesini dahil ediyorum. –

+0

Tamamen haklısınız. Aklımı kaybetti, çünkü normalde bunu yapmıyorum. Bunu sileceğim. Afedersiniz. – Anzurio

İlgili konular