Есть шаблонная функция:
template <class T1, class T2>
void function(T1 a, T1 b, T2 c) { ... }
Требуется, чтобы 3 параметр имел дефолтное значение. То есть хочется, чтобы было как-то так:
template <class T1, class T2>
void function(T1 a, T1 b, T2 c = С) { ... }
Но при вызове функции от 2 аргументов выдает ошибку. Как я понимаю дело в втором параметре шаблона. Нужно как-то тоже ему придать дефолтное значение.
Как бы это выразиться... Вы вызываете f(a,b)
- и что должен делать компилятор, не имея никакой информации о типе третьего параметра? Тип тоже надо умолчать...
Что-то вроде:
template<typename T, typename U = int>
void f(T a, T b, U c = U(0))
{
cout << a << " " << b << endl;
cout << typeid(c).name() << endl;
cout << c << endl;
}
int main()
{
f(0,1,3);
f(0,1,3.0);
f(0,1);
}
Аргументы по умолчанию не участвуют в процессе дедукции шаблонных параметров. Поэтому дедукция типа T2
из вызова функции function
с двумя аргументами сделана быть не может быть сделана на основе типа C
.
Пользуйтесь перегрузкой вместо умолчательных аргументов
template <class T1, class T2>
void function(T1 a, T1 b, T2 c)
{
...
}
template <class T1>
void function(T1 a, T1 b)
{
function(a, b, C);
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Здравствуйте, возникла проблема при выполнении программы
Приветствуюподскажите, есть обычная форма подписки и есть всплывающее окно при уходе с сайта
Пытаюсь расширить класс Array при помощи prototype, добавив в него свой метод, но при обходе массива циклом созданный метод видится элементом массива: