Шаблоны C ++ ByRef vs. ByVal

Я слежу за онлайн-курсом (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 на мой максимум функция работает нормально.

  1. Правильно ли я понимаю причину сбоя компиляции?
  2. Как код инструкторов компилируется без ошибок? Изменилось ли это в более поздних версиях C ++ (я полагаю, что класс использует C ++ 03)?
  3. Можно ли написать шаблон, где я могу передать либо ByRef или ByVal? Буду ли я в конечном итоге с 4 случая (а, б); (а&б); (а, б&); (а&, б&)

1

Решение

Поскольку вы возвращаете по значению, нет причин для того, чтобы параметры не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, победив всю цель сделать вашу функцию шаблоном, чтобы она работала с любым типом! Это является следствием «поиска, зависящего от аргумента».

Поэтому использование другого имени — лучший вариант.

3

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

Других решений пока нет …