Qt非静态成员引用必须与特定对象相关

时间:2016-05-30 15:19:07

标签: qt function

我有一个函数在从文件加载数据后调用emitResult。

bool IpResolver::ResolvedInfo::load(QTextStream &in)
{
ResolvedInfo rf;
while (!in.atEnd())
{
    QString line = in.readLine();
    QStringList list = line.split(' ');
    list[0] = rf.country;
    list[1] = rf.ip;
    if (rf.ip.isEmpty() == false)
    {
        emitResult(rf);
    }
}
}

所以这里是emitResult的声明:

private:
    void emitResult(const ResolvedInfo &data);

它给了我这个错误: 非静态成员引用必须与特定对象相关 不知道我该怎么做。

1 个答案:

答案 0 :(得分:1)

我认为

emitResultIpResolver的非静态成员函数。然而,您从子类IpResolver::ResolvedInfo开始,在没有任何实例的情况下调用它。请记住,仅仅因为ResolvedInfo是一个子类,并没有以任何其他方式使它变得特殊。具体来说,如果它没有对父类的实例进行引用,它就不会按照你期望的方式工作。

有两种常用方法可以解决您的问题:

您可以将IpResolver的引用传递给ResolvedInfo构造函数,并在ResolvedInfo实例中保留引用:

class IpResolver {
  class ResolvedInfo {
    IpResolver & q;
  public:
    ResolvedInfo(IpResolver & q) : q(q) { ... }
    static bool load(QTextStream &in) {
      ResolvedInfo rf;
      while (!in.atEnd())
      {
        QString line = in.readLine();
        QStringList list = line.split(' ');
        list[0] = rf.country;
        list[1] = rf.ip;
        if (!rf.ip.isEmpty())
          q.emitResult(rf);
      }
    }
  };
  void emitResult(const ResolvedInfo &);
  ...
};

或者您可以将emitResult设为静态方法:

class IpResolver {
  ...
  static void emitResult(const ResolvedInfo &);
};