Компилятор не может определить тип возвращаемого значения шаблона функции из аргумента функции. Вывод типа выполняется только с аргументами функции.
В C ++ 03 вы можете определить typedef в своем классе как:
struct A //suppose A is going to be type argument to your function template
{
int x, y; //I'm assuming type of x and y is same!
typedef int value_type; //type of x and y!
};
А затем вы должны переписать свою функцию как:
template <class P>
typename P::value_type Determinant(const P & a, const P & b, const P & c) {
return (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y);
}
Обратите внимание на тип возвращаемого значения, это зависимый тип. Его:
typename P::value_type
Здесь необходимо ключевое слово typename
.
Хорошо, поскольку вы сказали, что не можете изменять свои структуры, тогда вместо этого вы можете использовать черты. Вот как это можно сделать:
template<typename T> struct PTraits;
//Suppose this is your type which you can't modify
struct A //A is going to be type argument to your function template
{
long x, y;
};
//specialization: defining traits for struct A
template<>
struct PTraits<A>
{
typedef long value_type; //since type of A::x and A::y is long!
};
И ваш шаблон функции будет выглядеть так:
template <class P>
typename PTraits<P>::value_type Determinant(const P & a, const P & b, const P & c) {
return (b.x-a.x)*(c.y-a.y) - (c.x-a.x)*(b.y-a.y);
}
Обратите внимание на тип возврата; сейчас немного по-другому:
typename PTraits<P>::value_type
Опять же, value_type
является зависимым именем, поэтому необходимо ключевое слово typename
.
Обратите внимание, что вы должны специализировать PTraits<>
для каждого типа, который вы передаете шаблону функции, как я сделал.