Не было объявлено в этой области с дружественной функцией

Я не уверен, почему это происходит, но кажется, что он ошибочно выдает ошибку «не был объявлен в этой области». Я говорю это, потому что это работает на моем компьютере с Windows (компилятор MSVC), но не будет работать на моем Mac (GCC). Я использую Qt Creator, чтобы написать это. Вот моя ситуация:

Он выдает ошибку на моем pushButtonClicked...

void NewGpdDialog::on_pushButton_clicked()
{
    *xdbf = XDBFcreate(filePath.toStdString(), Achievement, ba.data(), ba.size(), &str);
}

точная ошибка, которую он выдает:

.../newgpddialog.cpp:63: ошибка: «XDBFcreate» не был объявлен в этой области

Я почти уверен, что это объявлено, потому что в верхней части моего файла я включаю:

#include "newgpddialog.h"
#include "ui_newgpddialog.h"
#include "xdbf.h"
#include <QDesktopServices>
#include <QBuffer>
#include <QFileDialog>
#include <QMessageBox>

"xdbf.h" - это то место, где он объявлен... Вот часть моего заголовочного файла XDBF:

class XDBF
{
public:
    XDBF(string path);
    ~XDBF();

    ...

    static std::string FILETIME_to_string(FILETIME *pft);
    friend XDBF* XDBFcreate(string filePath, GPD_Type type, char *imageData = NULL, size_t imageDataLen = 0, wstring *gameName = NULL);

Теперь у меня есть это в моем файле «xdbf.cpp» следующим образом:

XDBF* XDBFcreate(string filePath, GPD_Type type, char *imageData, size_t imageDataLen, wstring *gameName)
{
    ...
}

Кроме того, интересно то, что если я щелкну его правой кнопкой мыши в заголовке и нажму «Следовать за символом под курсором», он не сможет его найти ... Другое дело, имейте в виду, что это работает на моем компьютере с Windows.


person hetelek    schedule 21.05.2012    source источник
comment
Если я не ошибаюсь, XDBFcreate не кажется статическим методом.   -  person BeMFi    schedule 22.05.2012


Ответы (2)


Объявления друзей не действуют как полнофункциональное объявление.

Вам необходимо иметь отдельное объявление для XDBFcreate.

person Lalaland    schedule 21.05.2012

Функция, которая объявлена ​​только как дружественная, а не объявлена ​​также с отдельным объявлением пространства имен, может быть найдена только с помощью поиска, зависящего от аргумента. В вашем вызове XDBFcreate не используется аргумент типа XDBF, поэтому функция друга, объявленная в этом классе, не может быть найдена при поиске по имени.

Чтобы исправить код, добавьте объявление пространства имен XDBFcreate перед объявлением XDBF.

person Jonathan Wakely    schedule 22.05.2012