我正在学习重载内联函数。
在测试此代码时,我无法编译出以下错误,这些错误我无法理解是什么问题。
我仅使用1个内联函数对其进行了测试,并且可以工作,但是一秒钟破坏了它。能否请您分享一些指导:
谢谢您的帮助,塞尔吉奥
编译器错误:
#include "pch.h"
#include <iostream>
using namespace std;
// Overload abs() three ways
inline int abs(int n)
{
cout << "In integer abs() \n";
return((n < 0) ? -n : n);
}
inline long abs(long n)
{
cout << "In long abs() \n";
return((n < 0) ? -n : n);
}
inline double abs(double n) {
cout << "In double abs() \n";
return ((n < 0 ? -n : n));
}
int main()
{
cout << "Absolute value of -10 Is ";
cout << abs(-10) << "\n";
cout << "Absolute value of -10L Is ";
cout << abs(-10L) << "\n";
cout << "Absolute value of -10.01 Is ";
cout << abs(-10.01) << "\n";
}
答案 0 :(得分:5)
您的错误在这里:
using namespace std;
因为这将函数重载std::abs()
的定义引入全局命名空间(它们在cmath
中声明和定义,而这些重载似乎#include
直接或间接地放入{{1 }}),然后与您自己的定义冲突。上面的语句(iostream
几乎不是一个好主意,当然也不在头文件中-不幸的是,它通常用于在线编码竞赛中以简化代码(不需要using namespace std;
)。
顺便说一句,这仅与std::
有关,因为函数定义(而非声明)发生冲突,必须在头文件中将其声明为inline
才能获得正确的链接。
答案 1 :(得分:3)
前缀using namespace std;
与::std::abs
函数产生冲突。但是,摆脱using namespace std;
并不能解决问题。
这里的主要问题是global
命名空间中的函数使用了非唯一名称。 abs
是C标准库中的函数,因此您不应为自己的函数使用此名称。否则,如果<stdlib.h>
包含在某处,则可能会出错,甚至会因违反ODR而出现随机的Undefined Behavior。
为了防止C ++中的名称冲突,通常应在自定义名称空间中定义新函数:
n_sergio_solorzano_stuff
{
// Overload abs() three ways
inline int abs(int n)
{
...
或在需要向全局名称空间中添加某些内容时选择全局唯一名称:
inline int sergio_solorzano_stuff_abs(int n)