Почему эта функция друга не может получить доступ к закрытому члену класса? - PullRequest
5 голосов
/ 23 марта 2010

При попытке получить доступ к закрытому члену bin-ов класса 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

Ответы [ 4 ]

6 голосов
/ 23 марта 2010

Согласно моему GCC вышеупомянутый код не компилируется, потому что объявление extractHistogram() появляется после определения класса, в котором оно friend ed. Компилятор подавляет оператор friend, говоря, что extractHistogram не является ни функцией, ни элементом данных. Все работает хорошо, и bins становится доступным, когда я перемещаю объявление до определения класса (и добавляю предварительное объявление class GHistogram;, чтобы тип возвращаемого значения был известен компилятору). Конечно, код для extractHistogram() должен быть написан внутри пространства имен, либо

namesapce MyNameSpace {
// write the function here
}

или

GHistogram *MyNameSpace::extractHistogram( //....
2 голосов
/ 23 марта 2010

Попробуйте просто:

friend GHistogram *extractHistogram(GImage *image, qint32 numberOfBins);
1 голос
/ 23 марта 2010

Полагаю, вы имели в виду:

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

Вероятно, это не причина, а предположение:

Еще одна вещь: вам не нужно объявлять функцию вне класса, если она является другом такого класса и вы уже объявили ее в классе.

Другими словами:

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

//Your.cpp
void m()
{
}
1 голос
/ 23 марта 2010

Вы объявляете Gbdi::extractHistogram другом GHistogram, но вы объявляете функцию с именем extractHistogram и ожидаете, что она подружится с GHistogram. extractHistogram должен быть членом Gbdi.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...