Я получаю следующую ошибку, когда я пытаюсь получить доступ к члену парламента, не занимающему официального поста мусорных ведер GHistogram
класс из extractHistogram()
реализация:
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
Согласно моему GCC, приведенный выше код не компилируется, потому что объявление extractHistogram()
появляется после определения класса, в котором он friend
ed. Компилятор задыхается от оператора friend
, говоря, что extractHistogram
не является ни функцией, ни элементом данных. Все работает хорошо, и bins
доступен, когда я перемещаю объявление перед определением класса (и добавляю прямое объявление класс GHistogram;
, чтобы возвращаемый тип был известен компилятору). Конечно, код для extractHistogram()
должен быть записан внутри пространства имен, либо
namesapce MyNameSpace {
// write the function here
}
, либо
GHistogram *MyNameSpace::extractHistogram( //....
Попробуйте просто:
friend GHistogram *extractHistogram(GImage *image, qint32 numberOfBins);
Вы объявляете Gbdi::extractHistogram
другом GHistogram
, но вы объявляете функцию с именем extractHistogram
и ожидаете, что она будет дружить с GHistogram
. extractHistogram
должен быть членом Gbdi
.
Думаю, вы имели в виду:
friend GHistogram * extractHistogram(GImage *image, qint32 numberOfBins);
Вероятно, это не причина, а предложение:
Еще одна вещь, вам не нужно объявлять функция вне класса, если она является другом такого класса, и вы уже объявили ее внутри класса.
Другими словами:
//Your.h
class Foo
{
friend void m();
}
void m(); //This is totally unnecessary
//Your.cpp
void m()
{
}