Я не знаком с шаблонами. Я только начал изучать это. Почему я получаю ошибки в следующей программе?
#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>]
Пожалуйста, помогите мне.
Здесь происходит две вещи.
Ваша первая проблема заключается в том, что вы включили только часть сообщения об ошибке. Вот ссылка на код, выполняемый в 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).
Вы столкнулись с именным столкновением с std::min
, Скорее всего, он включен в один из других стандартных заголовков библиотеки, которые вы включили, либо <iostream>
или же <string>
моё предположение, вероятно, последнее. Быстрое решение состоит в том, чтобы переименовать вашу функцию. Например, переименовав его в mymin
работает отлично. демонстрация