error: invalid use of member <...> in static member function

error: invalid use of member <...> in static member function

当我尝试使用声明为 class 变量的映射 'freq' 的内容时遇到此错误,在我的比较器函数中对向量进行排序(使用映射到按频率对向量元素进行排序)。谁能强调我哪里出错了,我应该怎么做? 这是代码:

class Solution {
    map<int, int> freq;
public:
    static bool comp(int a, int b){
        if(a!=b){
            int c1 = freq[a];
            int c2 = freq[b];
            if(c1!=c2)
                return c1<c2;
            else{
                return a>b;
            }
        }
        return a>b;
    }
    vector<int> frequencySort(vector<int>& nums) {
        for(int i:nums){
            freq[i]++;
        }
        sort(nums.begin(), nums.end(), comp);
        return nums;
    }
};

错误是: 第 6 行:字符 22:错误:在静态成员函数中无效使用成员 'freq' int c1 = 频率 [a]; ^~~~

在 C++ 中,对静态成员函数的调用不绑定到任何对象,因此不包含任何隐式 this 指针。另一方面,每个对象接收自己的一组数据成员。在您的特定示例中,freq 是数据成员,comp 是静态成员函数,frequencySort 是 non-static 成员函数。对 non-static 成员函数的调用绑定到 class 的对象,因此接收隐式 this 指针。隐式this指针用于访问成员函数内部的数据成员。

现在,在您的特定情况下,comp 静态成员函数无法在没有对 class 对象的任何显式访问的情况下访问数据成员,因为没有隐式的 this 指针静态成员函数。

制作 freq 静态数据成员应该可以解决问题,并且可能是您想要的。

静态成员函数 不绑定到任何对象,即它们没有 this 指针。因此,我们不能在静态成员函数体内引用 this。此 限制 适用于 显式 使用 this 以及 隐式 使用this 通过调用 non-static 成员.

解决方案 1

解决此问题的一种方法是使 freq 成为 静态数据成员 Demo

解决方案 2

另一种方法是使 comp 成为 non-static 成员函数 Demo。请注意,这可能会导致其他逻辑错误,例如 comp 不能再用作比较器。

静态函数无法访问成员对象。但是如果你让 comp 成为 non-static 成员函数,你就不能再将它传递给 sort.

一个解决方案是创建 comp non-static 并在对 sort 的调用中将其包装在 lambda 中,类似于:

class Solution {
    map<int, int> freq;
public:
    bool comp(int a, int b){
        if(a!=b){
            int c1 = freq[a];
            int c2 = freq[b];
            if(c1!=c2)
                return c1<c2;
            else{
                return a>b;
            }
        }
        return a>b;
    }
    vector<int> frequencySort(vector<int>& nums) {
        for(int i:nums){
            freq[i]++;
        }
        sort(nums.begin(), nums.end(), [this](int a, int b) { return comp(a,b); });
        return nums;
    }
};