что означает «ошибка: ссылка на нестатический элемент должна быть связана с конкретным объектом»? - PullRequest
32 голосов
/ 22 марта 2012
int CPMSifDlg::EncodeAndSend(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
{
    ...

    return 1;
}

extern "C"
{
    __declspec(dllexport) int start(char *firstName, char *lastName, char *roomNumber, char *userId, char *userFirstName, char *userLastName)
    {
        return CPMSifDlg::EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);
    }
}

В сети return CPMSifDlg::EncodeAndSend У меня ошибка: Ошибка: нестатическая ссылка на элемент должна относиться к конкретному объекту.

Что это значит?

Ответы [ 3 ]

38 голосов
/ 22 марта 2012

EncodeAndSend не является статической функцией, что означает, что ее можно вызывать для экземпляра класса CPMSifDlg.Вы не можете написать это:

 CPMSifDlg::EncodeAndSend(/*...*/);  //wrong - EncodeAndSend is not static

Это скорее должно называться:

 CPMSifDlg dlg; //create instance, assuming it has default constructor!
 dlg.EncodeAndSend(/*...*/);   //correct 
8 голосов
/ 22 марта 2012

CPMSifDlg::EncodeAndSend() метод объявлен как не-static, и поэтому он должен вызываться с использованием объекта CPMSifDlg. например,

CPMSifDlg obj;
return obj.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);

Если EncodeAndSend не использует / не связывает какие-либо особенности объекта (т.е. this), но общие для class CPMSifDlg, тогда объявите его как static:

class CPMSifDlg {
...
  static int EncodeAndSend(...);
  ^^^^^^
};
7 голосов
/ 22 марта 2012

Только статические функции вызываются с именем класса.

classname::Staicfunction();

Нестатические функции должны вызываться с использованием объектов.

classname obj;
obj.Somefunction();

Это именно то, что означает ваша ошибка. Поскольку ваша функция не является статичной, вы должны использовать ссылку на объект для ее вызова.

...