【问题标题】:Why am i getting error "call of overloaded 'abs(long long unsigned int)' is ambiguous"?为什么我收到错误消息“重载调用 \'abs(long long unsigned int)\' 不明确”?
【发布时间】:2022-12-20 09:28:27
【问题描述】:

所以我尝试编译以下代码:

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int> nums;
    while(n--){
        int temp;
        cin>>temp;
        nums.push_back(temp);
    }
    long long sum=0;
    for(int i:nums){
        sum+=i;
    }
    int index;
    long long temp_sum=0,avgdiff=0,min_avgdiff=LLONG_MAX;
    for(int i=0;i<nums.size();i++){
        temp_sum+=nums[i];
        if(i!=nums.size()-1) avgdiff=abs((temp_sum/(i+1))-((sum-temp_sum)/(nums.size()-i-1)));
        else avgdiff=temp_sum/(i+1);    
        if(min_avgdiff>avgdiff){
            min_avgdiff=avgdiff;
            index=i;
        }
    }
    cout<<index;

    return 0;
}

之后,我在第 22 行(代码中最长的一行)遇到了这样的错误:“错误:重载 'abs(long long unsigned int)' 的调用不明确”。

但是当我修改我的代码时,如下所示:

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int> nums;
    while(n--){
        int temp;
        cin>>temp;
        nums.push_back(temp);
    }
    long long sum=0;
    for(int i:nums){
        sum+=i;
    }
    int index;
    long long temp_sum=0,avgdiff=0,min_avgdiff=LLONG_MAX;
    for(int i=0;i<nums.size();i++){
        temp_sum+=nums[i];
        long long avg1=temp_sum/(i+1),avg2=0;
        if(i!=nums.size()-1){
            avg2=(sum-temp_sum)/(nums.size()-i-1);
        }
        avgdiff=abs(avg1-avg2);
        if(min_avgdiff>avgdiff){
            min_avgdiff=avgdiff;
            index=i;
        }
    }
    cout<<index;

    return 0;
}

我没有收到任何错误!!谁能解释我为什么?

【问题讨论】:

  • edit 你的问题包括完整和完整的构建输出,复制粘贴为文本。它通常可以包含有助于理解问题的注释或其他信息。
  • 空格不收取额外费用:-)。如果运算符被空格隔开一点并且语句被分成几行较短的行,那么最长的一行将不那么令人生畏(并且更容易阅读)。
  • 这是类型(如错误消息所述)。您将 long long 传递给 abs 的第二个版本很好。但在第一个示例中,您传递的是 unsigned long long 并且没有过载。无符号类型的原因是存在具有无符号类型的nums.size()
  • @Someprogrammerdude 是的,当然
  • error: call of overloaded 'abs(long long unsigned int)' is ambiguousabs 来自unsinged?这聪明吗? unsigned 类型可以为负数吗?

标签: c++


【解决方案1】:

nums.size() 是一个无符号值 (size_t),这意味着整个表达式 (temp_sum/(i+1))-((sum-temp_sum)/(nums.size()-i-1)) 是无符号的。函数abs 没有采用无符号值的重载(特别是在您的情况下,long long unsigned int),因此它不知道要调用哪个版本的函数。

您的第二段代码有效,因为您将此无符号值分配给具有带符号类型的变量,然后对该带符号的值调用abs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 2012-01-27
    相关资源
    最近更新 更多