“error: a nonstatic member reference must be relative to a specific object” 是什么意思?

66
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个回答

72

EncodeAndSend不是一个静态函数,这意味着它可以被调用在CPMSifDlg类的实例上。你不能写成这样:

EncodeAndSend不是一个静态函数,意味着可以在CPMSifDlg类的实例上调用。你不能这样写:

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

它应该被称为:

 CPMSifDlg dlg; //create instance, assuming it has default constructor!
 dlg.EncodeAndSend(/*...*/);   //correct 

但是如果我移除“CPMSifDlg”,就会出现“错误:未定义标识符EncodeAndSend”的情况。 - Oscar Yuandinata
CPMSifDlg dlg; return dlg.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName);它表示这个方法无法访问。 - Oscar Yuandinata
@OscarYuandinata:是的。你需要创建一个类的实例,才能调用函数。或者将函数变成静态成员函数,或者只是一个自由函数。 - Nawaz
CPMSifDlg dlg; return dlg.EncodeAndSend(firstName, lastName, roomNumber, userId, userFirstName, userLastName); 这段代码提示该方法无法访问。 - Oscar Yuandinata
问题是,如果它们是友元类,它仍然会出现这个错误,这没有任何意义。奇怪。 - Dexter

15

只有静态函数可以使用类名来调用。

classname::Staicfunction();

非静态函数必须通过对象调用。

classname obj;
obj.Somefunction();

这正是你错误的意思。由于你的函数是非静态的,因此必须使用对象引用来调用它。


我不认为这是严格正确的。如果在派生类内部调用基类中的非静态方法,则使用语法Base::function()。 - Flakker
如果你的派生方法是非静态的。 - Rohit Vipin Mathews

12

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(...);
  ^^^^^^
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接