我有一个函数在从文件加载数据后调用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);
它给了我这个错误: 非静态成员引用必须与特定对象相关 不知道我该怎么做。
答案 0 :(得分:1)
emitResult
是IpResolver
的非静态成员函数。然而,您从子类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 &);
};