内联重载引发错误C ++

时间:2019-01-22 16:33:32

标签: c++ visual-studio overloading inline

我正在学习重载内联函数。

在测试此代码时,我无法编译出以下错误,这些错误我无法理解是什么问题。

我仅使用1个内联函数对其进行了测试,并且可以工作,但是一秒钟破坏了它。能否请您分享一些指导:

谢谢您的帮助,塞尔吉奥

编译器错误:

  • abs异常规范与先前的声明行13不符
  • 函数long abs(const long)throw()已经具有正文行13
  • abs重新定义;不同的异常说明行19
  • 函数定义或声明中的
  • abs错误;函数不称为第30行
  • 函数定义或声明中的
  • abs错误;函数不称为第32行

#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";
}

2 个答案:

答案 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)