есть ли вообще переопределить встроенные функции? в с ++ - PullRequest
0 голосов
/ 19 марта 2020

поэтому я пытался переопределить функцию max, и я столкнулся с большим количеством ошибок

> call of overloaded 'max(int&, int&)' is ambiguous

> /usr/include/c++/7/bits/stl_algobase.h:219:5: note: candidate: constexpr const _Tp& std::max(const _Tp&, const _Tp&) [with _Tp = int]
     max(const _Tp& __a, const _Tp& __b)
> 
> In file included from /usr/include/c++/7/bits/char_traits.h:39:0,
                 from /usr/include/c++/7/ios:40,
                 from /usr/include/c++/7/ostream:38,
                 from /usr/include/c++/7/iostream:39,
                 from prog.cpp:1:

мой код:

#include<iostream>

using namespace std;

template <typename T>

T max(T a, T b)
{
    return a > b?a:b;
}

int main()
{
    cout<< max(5,4);

    return 0;
}

есть способ переопределить встроенную функцию или предопределенные функции ?

, даже если я объявляю

int a(5),b(4);
cout<<max(a,b);

, это дает мне ошибки

1 Ответ

5 голосов
/ 19 марта 2020

max не является встроенной функцией, она является частью стандартной библиотеки. Вы не пытаетесь переопределить / заменить его, вы просто добавляете другую перегрузку функции, которая будет учитываться при разрешении перегрузки и сделает вызов неоднозначным, потому что и ваша перегрузка, и ваша стандартная библиотека, которую вы импортировали с помощью using namespace std;, будут match.

Ваша проблема в том, что вы используете using namespace std;, который импортирует все имена из стандартного пространства имен библиотеки std:: в глобальное пространство имен.

This считается плохой практикой именно по той причине, что это вызовет такую ​​проблему, как ваша.

Удалите using namespace std; и вместо этого всегда либо префиксируйте имена из стандартного пространства имен библиотеки с помощью std::, например std::cout, либо импортировать только выбранный список имен, например:

using std::cout;

Однако нет смысла определять max самостоятельно. std::max из #include<algorithm> уже делает именно то, что вы хотите max (только для того, чтобы позаботиться о некоторых крайних случаях, которые вы не рассматриваете).

Просто используйте std::max (или * 1027) * после using std::max;) и не определяйте свою собственную реализацию.

...