Я немного запутался со специализацией шаблонов.
У меня есть классы Vector2
, Vector3
, в которых есть operator+=
(которые определены следующим образом).
Vector2& operator+=(const Vector2& v) {
x() += v.x(), y() += v.y();
return *this;
}
Теперь я хочу добавить общее поведение сложения и сказать что-то вроде:
template <typename V> const V operator+(const V& v1, const V& v2) {
return V(v1) += v2;
}
Это прекрасно компилируется и работает как для Vector2
, так и для Vector3
. Но, скажем, я хочу иметь более эффективную операцию "+" для моей Vector2
и хочу, чтобы она действовала следующим образом ( с использованием шаблона специализации) :
template<> const Vector2 operator+(const Vector2& v1, const Vector2& v2) {
return Vector2(v1.x() + v2.x(), v1.y() + v2.y());
}
Это выглядит хорошо для меня, но, к сожалению, размещение этих двух частей кода сразу после друг друга приводит к сбою компиляции
(компоновщик сообщает об ошибке LNK2005: "Vector2 const operator+<Vector2>(Vector2 const &,Vector2 const &)" (??$?HVVector2@core@lf@@@core@lf@@YA?BVVector2@01@ABV201@0@Z) already defined in ...
)
В чем моя ошибка и где я ошибся?
Спасибо.