C++ 带有 abs() 的代码无法编译

C++ Code with abs() does not compile

本文关键字:代码 编译 带有 abs C++      更新时间:2023-10-16

代码如下。该代码无法在在线编译器上编译,我不知道为什么。它简短且不言自明,详情请看下文。

#include <iostream>
#include <cmath> 
using namespace std;
int N;
int distance(int a, int b){
    if(abs(a-b) > N/2){
        return N - abs(a-b);
    }
    return abs(a-b);
}
bool test(int x, int y){
    if(distance(x,y) <=2){
        return true;
    }
    return false;
}
int main()
{
    N = 2;
   cout << "Hello World" << endl; 
   cout << test(3,4) << endl;
   return 0;
}

错误消息如下:

In file included from /usr/include/c++/4.8.3/bits/stl_algobase.h:65:0,                           
                 from /usr/include/c++/4.8.3/bits/char_traits.h:39,                              
                 from /usr/include/c++/4.8.3/ios:40,                                             
                 from /usr/include/c++/4.8.3/ostream:38,                                         
                 from /usr/include/c++/4.8.3/iostream:39,                                        
                 from main.cpp:1:                                                                
/usr/include/c++/4.8.3/bits/stl_iterator_base_types.h: In instantiation of 'struct std::iterator_
traits<int>':                                                                                    
/usr/include/c++/4.8.3/bits/stl_iterator_base_funcs.h:114:5:   required by substitution of 'templ
ate<class _InputIterator> typename std::iterator_traits<_Iterator>::difference_type std::distance
(_InputIterator, _InputIterator) [with _InputIterator = int]'                                    
main.cpp:15:20:   required from here                                                             
/usr/include/c++/4.8.3/bits/stl_iterator_base_types.h:165:53: error: 'int' is not a class, struct
, or union type                                                                                  
       typedef typename _Iterator::iterator_category iterator_category;                          
                                                     ^                                           
/usr/include/c++/4.8.3/bits/stl_iterator_base_types.h:166:53: error: 'int' is not a class, struct
, or union type                                                                                  
       typedef typename _Iterator::value_type        value_type;                                 
                                                     ^                                           
/usr/include/c++/4.8.3/bits/stl_iterator_base_types.h:167:53: error: 'int' is not a class, struct
, or union type                                                                                  
       typedef typename _Iterator::difference_type   difference_type;                            
                                                     ^                                           
/usr/include/c++/4.8.3/bits/stl_iterator_base_types.h:168:53: error: 'int' is not a class, struct
, or union type                                                                                  
       typedef typename _Iterator::pointer           pointer;                                    
                                                     ^                                           
/usr/include/c++/4.8.3/bits/stl_iterator_base_types.h:169:53: error: 'int' is not a class, struct
, or union type                                                                                  
       typedef typename _Iterator::reference         reference;
using namespace std;

这是一个坏主意;它将在 std 命名空间中声明的任何内容转储到全局命名空间中,在那里它可能与您在全局命名空间中声明的任何内容冲突。

int distance(int a, int b)

这将声明全局命名空间中的函数与 std 命名空间中同名的函数模板冲突。

if(distance(x,y) <=2)

根据重载解析的神秘规则,std::distance模板比函数更匹配。尝试实例化它失败了,因为它只能为迭代器类型实例化,而不能实例化int

最好的选择是删除流氓 using 指令,并将std::添加到标准库中使用的任何内容中。如果出于某种原因不想这样做,请限定函数调用以指定在全局命名空间中声明的函数调用:

if(::distance(x,y) <=2)