Там нет никакого способа для компилятора вывести 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++, будет непросто. Вы можете использовать мой promote template для этого. Если вы чувствуете, что это довольно смущает вопрос для вас, и что вы в порядке, явно предоставляя тип возврата, я думаю, что лучше остановиться, явно предоставляя его. Как Herb Sutter says «Напишите, что вы знаете, и знать, что вы пишете»
Nontheless вы можете сделать выше, как это с этим шаблоном
template <typename t1, typename t2>
typename promote<t1, t2>::type adder1 (t1 a, t2 b)
{
return (a + b);
};
'std :: plus' кто-нибудь? :) +1 –
большое спасибо за ответ – osum