Member 14068785 Ответов: 2

Шаблоны и аргументы по умолчанию ...


Уважаемые эксперты, у меня есть этот фрагмент кода:

template <typename genericType = int>
genericType add (genericType a, genericType b)
{
  return a + b;
}

int main ()
{
 int i1 = 1;
 double d2 = 3.14;
 
std::cout << "Add: " << add<> (i1,d2) << std::endl;

return 0;
}

это дает мне следующую ошибку во время компиляции:

test.cpp:14:27: error: no matching function for call to 'add'
  std::cout << "Add: " << add<> (i1,d2) << std::endl;
                          ^~~~~
test.cpp:4:13: note: candidate template ignored: deduced conflicting types for parameter 'genericType' ('int' vs. 'double')
genericType add (genericType a, genericType b)
            ^
1 error generated.

Есть ли способ, которым я могу привести аргументы, чтобы быть int?
Я думал, что это возможно с помощью значения шаблона по умолчанию.

Большое спасибо,
- Мауро.

Что я уже пробовал:

template <typename genericType = int>
genericType add (genericType a, genericType b)
{
  return a + b;
}

int main ()
{
 int i1 = 1;
 double d2 = 3.14;
 
std::cout << "Add: " << add<> (i1,d2) << std::endl;

return 0;
}

2 Ответов

Рейтинг:
0

Richard MacCutchan

Вы объявили тип по умолчанию равным int поэтому он ожидает этого для обоих аргументов. Видеть Шаблоны (C++)[^] для полного объяснения.


Рейтинг:
0

CPallini

Нет, это не работает. С тех пор как вы уточнили genericType для обеих сторон a и b тогда эти аргументы должны иметь один и тот же тип, иначе вывод аргумента шаблона завершится неудачей.
Кстати, аргумент шаблона по умолчанию не имеет никакого эффекта, так как компилятор всегда может вывести genericType тип из фактического типа(ов) аргумента функции.