встроенные ошибки перегрузки C ++ - PullRequest
0 голосов
/ 22 января 2019

Я учусь перегружать встроенную функцию.

При тестировании этого кода я не могу скомпилировать следующие ошибки, не могу понять, что не так.

Я проверил это сРаботает только 1 встроенная функция, но ее прерывает секунда.Не могли бы вы поделиться некоторыми рекомендациями:

Спасибо за вашу помощь, Sergio

Ошибки компилятора:

  • Спецификация исключений 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 голосов
/ 22 января 2019

Precense of using namespace std; вызывает конфликт с функцией ::std::abs. Однако избавление от using namespace std; не решит проблему полностью.

Основной проблемой здесь является использование неуникального имени для функции в global пространстве имен. abs - это функция из стандартной библиотеки C, поэтому вы не должны использовать это имя для своих собственных функций. В противном случае вы можете получить сообщение об ошибке, если <stdlib.h> включено где-то, или даже случайное неопределенное поведение из-за нарушения ODR.

Чтобы предотвратить конфликты имен в C ++, вы обычно должны определять новые функции в пользовательском пространстве имен:

n_sergio_solorzano_stuff
{
    // Overload abs() three ways
    inline int abs(int n)
    {
    ...

или выберите глобально уникальные имена, когда вам нужно добавить что-то в глобальное пространство имен:

inline int sergio_solorzano_stuff_abs(int n)
0 голосов
/ 22 января 2019

Ваша ошибка здесь:

using namespace std;

, поскольку это приводит к глобальному пространству имен определения перегрузок функции std::abs() (они объявлены и определены в cmath, который выглядит как #included прямо или косвенно в iostream), что затем противоречит вашим собственным определениям.Вышеупомянутое утверждение (using namespace std;) почти никогда не является хорошей идеей, конечно, не в заголовочном файле - к сожалению, оно обычно используется в онлайн-конкурсах кодирования для упрощения кода (не нужно std::).

Кстати, это имеет отношение только к inline, поскольку конфликты определений функций (а не объявлений) должны быть объявлены inline в заголовочных файлах для получения правильной связи.

...