C++ 带有 abs() 的代码无法编译
C++ Code with abs() does not compile
代码如下。该代码无法在在线编译器上编译,我不知道为什么。它简短且不言自明,详情请看下文。
#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)
相关文章:
- 如何修复sfml c++代码编译错误
- 尝试用java代码编译和运行c++代码
- 此代码编译良好,但文件未创建?请指出错误
- 为什么我的 BaseClass:Method 代码编译(带有单冒号)?
- 代码编译没有任何输出,入门程序
- 通过Python Distutils(用于Python C扩展)使用可重定位的设备代码编译CUDA代码
- 代码编译但不起作用!cmd窗口只是理想和理想,但什么也没发生
- 无法使用 g++ 使用C++代码编译 C 库
- 如何在Ubuntu中使用Visual Studio代码编译C++代码
- 推力+提升代码编译错误
- C++代码编译,但在 Zorin OS 上运行时显示错误
- 如何在使用模板时将 CPP 代码编译到库文件中
- 是否可以将Visual Studio 2017将C 代码编译到EXE以外的文件类型中
- 使用 Visual Studio for C++ 代码编译错误
- 使用 Android Studio 使用本机代码编译 apk 时,如何在链接处删除 libgnustl_static.
- 使用 Emscripten 将 OpenCV 代码编译C++ Javascript
- 将C 代码编译到独立应用程序.App
- 为什么此代码编译 (C++11) 而没有类型不匹配错误
- 重用编译器前端的结果,以加快多个配置/平台的C++代码编译
- 如何将C++11代码编译为网络汇编