Ошибка неоднозначности вызова функции шаблона

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

#include <iostream>
#include <string>
using std::cout;
using std::string;
template<class C>
C min(C a,C b) {
return a<b?a:b;
}
int main()
{
string a="first string";
string b="second string";
cout<<"minimum string is: "<<min(a,b)<<'\n';
int c=3,d=5;
cout<<"minimum number is: "<<min(c,d)<<'\n';
double e{3.3},f{6.6};
cout<<"minimum number is: "<<min(e,f)<<'\n';
char g{'a'},h{'b'};
cout<<"minimum number is: "<<min(g,h)<<'\n';
return 0;
}

Ошибки:

13  [Error] call of overloaded 'min(std::string&, std::string&)' is ambiguous

6   [Note] C min(C, C) [with C = std::basic_string<char>]

Пожалуйста, помогите мне.

11

Решение

Здесь происходит две вещи.

Ваша первая проблема заключается в том, что вы включили только часть сообщения об ошибке. Вот ссылка на код, выполняемый в gcc и clang, и одно из полученных сообщений об ошибке (полностью):

main.cpp:13:34: error: call to 'min' is ambiguous
cout<<"minimum string is: "<<min(a,b)<<'\n';
^~~
/usr/include/c++/v1/algorithm:2579:1: note: candidate function [with _Tp = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
min(const _Tp& __a, const _Tp& __b)
^
main.cpp:6:3: note: candidate function [with C = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
C min(C a,C b) {
^

Есть два кандидата. Один в main.cpp:6:3 (строка 6, символ 3) и один на algorithm:2579:1 (строка 2579, символ 1).

Один из них ты написал, а один из них в #include <algorithm>,

Один из ваших заголовочных файлов включен <algorithm> без тебя об этом. Стандартные заголовки могут делать это, как бы это ни раздражало.

В <algorithm> Eсть std::min шаблон функции. Как std::string это экземпляр класса шаблона в namespace std, шаблон функции std::min обнаруживается с помощью процесса, называемого «поиск с учетом аргументов» или «поиск по Кенигу». (Кандидаты перегрузки функции ищутся локально, а также в пространствах имен аргументов функции, а также в пространствах имен аргументов шаблона для аргументов функции и в пространствах имен вещей, на которые указывают аргументы объекта. функция и т. д.)

Ваша местная функция min также находится в том же пространстве имен, что и тело main,

Оба одинаково хороши, и компилятор не может решить, какой из них вы хотите вызвать. Так что выдает ошибку, сообщающую вам об этом.

И gcc и clang делают error: затем последовательность note:s. Обычно все из note:s после ошибки важны для понимания ошибки.

Чтобы это исправить, попробуйте позвонить ::min (полностью квалифицируя вызов), или переименовав функцию во что-то другое, или сделайте вашу версию более подходящей, чем std::min (сложно, но выполнимо в некоторых случаях), или вызов (min)(a,b), Последний блокирует поиск ADL / Koenig, а также блокирует раскрытие макроса (например, если какая-то ОС вставила #define min макросы в их системные заголовки) (через @ 0x499602D2).

14

Другие решения

Вы столкнулись с именным столкновением с std::min, Скорее всего, он включен в один из других стандартных заголовков библиотеки, которые вы включили, либо <iostream> или же <string>моё предположение, вероятно, последнее. Быстрое решение состоит в том, чтобы переименовать вашу функцию. Например, переименовав его в mymin работает отлично. демонстрация

5

По вопросам рекламы [email protected]