Перегрузка бинарного оператора "-"
Почему же не работает?
Ошибка C2676 бинарный "-": "coord" не определяет этот оператор или преобразование к типу приемлемо к встроенному оператору
#include <iostream>
template <typename T>
class coord
{
private :
T value;
public:
coord(T out_value = 0)
{
value = out_value;
}
auto operator-(const coord& outsider) -> decltype (this->value - outsider.value)
{
return (this->value - outsider.value);
}
};
int main()
{
coord<double> first(10);
coord<int> second(3.3);
std::cout << (first - second);
return 0;
}
Ответы (1 шт):
Так как у вас first и second имеют разные типы (шаблоны инстанцируются с разными типами), то вы не можете использовать бинарный оператор, определенный только для конкретного типа. Для того, чтобы оно работало со всеми инстансами нужно чтобы этот оператор также был шаблонным. Для этого придется сделать value публичным членом, так как нужен будет доступ снаружи объекта:
#include <iostream>
template <typename T> class coord {
public:
T value;
public:
coord(T out_value = 0) { value = out_value; }
};
template <typename FirstValueType, typename SecondValueType>
auto operator-(const coord<FirstValueType> &first,
const coord<SecondValueType> &second)
-> decltype(first.value - second.value) {
return (first.value - second.value);
}
int main() {
coord<double> first(10.);
coord<int> second(3.3);
std::cout << (first - second);
return 0;
}
В примере я сделал функцию свободной, но можно реализовать и внутри класса. Для этого нужно будет оставить только SecondValueType в шаблонных аргументах.