Шаблонная функция

234
10 апреля 2017, 07:15

Есть шаблонная функция:

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 аргументов выдает ошибку. Как я понимаю дело в втором параметре шаблона. Нужно как-то тоже ему придать дефолтное значение.

Answer 1

Как бы это выразиться... Вы вызываете 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);
}
Answer 2

Аргументы по умолчанию не участвуют в процессе дедукции шаблонных параметров. Поэтому дедукция типа 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);
}
READ ALSO
Ошибка при выделении памяти в Си (Access violation)

Ошибка при выделении памяти в Си (Access violation)

Здравствуйте, возникла проблема при выполнении программы

269
Как узнать, нажималась ли кнопка в форме

Как узнать, нажималась ли кнопка в форме

Приветствуюподскажите, есть обычная форма подписки и есть всплывающее окно при уходе с сайта

260
Как правильно расширить класс?

Как правильно расширить класс?

Пытаюсь расширить класс Array при помощи prototype, добавив в него свой метод, но при обходе массива циклом созданный метод видится элементом массива:

237