Если вы планируете использовать что-либо, кроме простых типов, которые вы хотите (в заголовочном файле):
template <typename A>
inline A add(const A& a, const A& b) { return a + b; }
Обратите внимание на «inline».
Как отмечали другие, проблема со смешанными типами заключается в том, как определить тип возвращаемого значения из типов аргументов. Предположим, мы придерживаемся простых типов и имеем:
шаблон
inline A add (A a, B b) {вернуть a + b; }
Тогда это терпит неудачу (вероятно, только с предупреждением):
double d = add(1, 1.5); // Sets d to 2.0
Так что вам нужно поработать. Например:
template<class A, class B>
struct Promote
{
};
template<class A>
struct Promote<A,A>
{
typedef A Type;
};
template<>
struct Promote<int, double>
{
typedef double Type;
};
template<>
struct Promote<double, int>
{
typedef double Type;
};
Функция добавления становится:
template<class A, class B>
inline typename Promote<A,B>::Type add(A a, B b)
{
return a + b;
}
Для вас все это гарантирует, что тип возвращаемого значения , который вы указываете для добавления заданной пары типов. Это будет работать даже для сложных типов.