Я слежу за онлайн-курсом (Pluralsight.com) на C ++ и борюсь с упражнением по шаблонам, в частности передаю фактическое число (например, 3
) к шаблону, который ожидает (T& t)
,
Код, написанный инструктором, не будет компилироваться на моем ПК — я думаю, я понимаю, почему он не будет компилироваться, но хочу узнать, как он скомпилирован для инструктора (который его демонстрирует) и как вы должны справиться с этим делом.
#include "stdafx.h"#include <iostream>
template <class T>
T myMax(T& t1, T& t2)
{
return t1 < t2 ? t2 : t1;
}
int main()
{
int result = myMax(3, 4);
return result;
}
РЕДАКТИРОВАТЬ: Исправлена опечатка в коде (из моих экспериментов, прежде чем задать вопрос). Кажется, вбежал https://ideone.com/1cjJUD так что я теперь не уверен, почему это не скомпилируется для меня! (Спасибо @ user4581301)
EDIT2 Пост-ответ, измените название функции, чтобы избежать путаницы. Следует прояснить вопрос для всех, кто сталкивается с тем же. https://ideone.com/dZffn6
Ошибка компилятора "C2664 'T max<int>(T &,T &)': cannot convert argument 1 from 'int' to 'int &"
Это выглядит как неудача 3
является действительным числом, а не ссылкой на число, хранящееся где-то. декларирование int a=3;
и прохождение a
на мой максимум функция работает нормально.
Поскольку вы возвращаете по значению, нет причин для того, чтобы параметры неconst
, Значения (включая литералы и временные объекты) совместимы с const
Рекомендации. Так что это был бы хороший способ исправить это, не имея дело со всеми возможными комбинациями:
template <class T>
T myownmax(T const& t1, T const& t2)
{
return t1 < t2 ? t2 : t1;
}
Обратите внимание, что я переименовал функцию, чтобы избежать двусмысленности с std::max
, Нил упомянул удаление using namespace std;
в комментарии — хотя эта строка вызывает проблему, ее устранение не является полным решением.
В частности даже без using namespace std;
, код std::complex<double> a, b; auto c = max(a, b);
все равно найду std::max
, победив всю цель сделать вашу функцию шаблоном, чтобы она работала с любым типом! Это является следствием «поиска, зависящего от аргумента».
Поэтому использование другого имени — лучший вариант.
Других решений пока нет …