Почему этот друг функция не может получить доступ к члену парламента, не занимающему официального поста класса?

Я получаю следующую ошибку, когда я пытаюсь получить доступ к члену парламента, не занимающему официального поста мусорных ведер 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
5
задан Alceu Costa 23 March 2010 в 16:39
поделиться

4 ответа

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

namesapce MyNameSpace {
// write the function here
}

, либо

GHistogram *MyNameSpace::extractHistogram( //....
6
ответ дан 13 December 2019 в 22:05
поделиться

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

friend GHistogram *extractHistogram(GImage *image, qint32 numberOfBins);
2
ответ дан 13 December 2019 в 22:05
поделиться

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

1
ответ дан 13 December 2019 в 22:05
поделиться

Думаю, вы имели в виду:

 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
ответ дан 13 December 2019 в 22:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: