Компилятор не может вывести t3
из аргументов функции. Вы должны передать этот аргумент явно. Измените порядок параметров, чтобы сделать это возможным
template <typename t3, typename t1, typename t2>
t3 adder1 (t1 a , t2 b)
{
return t3(a + b); // use t3 instead of fixed "int" here!
};
Тогда вы можете позвонить с помощью adder1<int>(1, 6.0)
. Сложнее, если вы хотите вывести t3
к фактическому результату сложения. C ++ 0x (кодовое имя следующей версии C ++) позволит сделать это, сказав, что возвращаемый тип равен типу сложения следующим образом
template <typename t1, typename t2>
auto adder1 (t1 a , t2 b) -> decltype(a+b)
{
return a + b;
};
Тогда вы могли бы явно разыграть в точке использования
int sum = (int) adder1(1,6.0); // cast from double to int
Имитация этого в текущей версии C ++ не будет легкой. Вы можете использовать мой шаблон продвижения , чтобы сделать это. Если вы чувствуете, что это довольно запутанно для вас, и вы согласны с явным предоставлением возвращаемого типа, я думаю, что лучше остановиться на явном предоставлении этого. Как Херб Саттер говорит «Пиши, что знаешь, и знай, что пишешь»
Тем не менее, вы можете сделать выше, как это с этим шаблоном
template <typename t1, typename t2>
typename promote<t1, t2>::type adder1 (t1 a, t2 b)
{
return (a + b);
};