2010-03-23 3 views
5

나는 extractHistogram() 구현 내에서 GHistogram 클래스의 빈에게 개인 멤버에 액세스하려고 할 때 다음과 같은 오류가 점점 오전 다음 extractHistogram() 구현이 친구 기능이 클래스의 개인 회원에 액세스 할 수없는 이유는 무엇입니까?

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

어디에 '이 맥락에서'오류 지점을. 친구 함수 선언문에 무엇이 잘못되었는지 알 수 있습니까?

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 :: extractHistogram'을 가지고 있습니다. – quamrana

+0

죄송합니다. Gbdi를 MyNamespace로 바꾸십시오. GBDI는 제가 일하는 연구 그룹의 이름입니다 ... –

답변

5

: 즉

. 컴파일러는 friend 문에서 extractHistogram이 함수가 아니며 데이터 멤버도 아닙니다라고 말합니다. 모든 것은 잘 작동하고 bins은 클래스 정의 앞에 선언을 이동하고 (반환 값 유형이 컴파일러에 알려 지도록 forward 선언을 class GHistogram; 추가 할 때) 액세스 할 수 있습니다. `Gbdi`는 클래스 또는 네임 스페이스 물론 extractHistogram()의 코드 중 하나

namesapce MyNameSpace { 
// write the function here 
} 

또는

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

감사합니다! 나는 클래스 선언 전에 extractHistogram()을 선언하려했으나 함수 구현에서 네임 스페이스 범위가 누락 되었기 때문에 작동하지 않았습니다. 'using namespace'절을 사용해야 만했습니다. –

1

당신은 GHistogram에 친구가 Gbdi::extractHistogram를 선언,하지만 당신은 extractHistogram라는 기능를 선언하고 GHistogram와 친구에게 그것을 기대 :

여기에 코드입니다. extractHistogramGbdi의 구성원이어야합니다.

+0

실수로 죄송합니다. 코드에서 Gbdi 대신 MyNamespace가 올바른 것입니다. –

2

그냥보십시오 :

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

실수로 죄송합니다. 올바른 코드는 Gbdi int 대신 MyNamespace입니다. MyNamespace를 제거하면 같은 오류가 발생합니다. –

1

난 당신이 의미 추측 :

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

이것은 아마 이유하지만 제안입니다 :

한가지 더, 당신은하지 않습니다 그러한 클래스의 친구이고 이미 클래스 안에서 선언했다면 클래스 밖에서 함수를 선언해야합니다. 내 GCC extractHistogram()의 선언이 friend 에드 인 클래스 정의 후에 나타나기 때문에 위의 코드는 컴파일되지 않습니다에 따르면

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

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

하지만 그렇게하면 m()을 호출 할 때 'main.cpp'에서 int main()이라고 말하면 '이 범위에서 m()이 선언되지 않았다'는 오류가 표시됩니다. 내 'main.cpp'에 'Your.h'를 포함시킵니다. –

+0

당신은 완전히 옳습니다. 평소 그렇게하지 않았기 때문에 그것은 내 마음을 미끄러 뜨 렸습니다. 내가 그걸 지울거야. 죄송합니다. – Anzurio

관련 문제