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;
}
};
当我尝试使用声明为 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;
}
};