C++基本模板问题

Yip*_*Yay 4 c++ templates specialization

我对模板专业化略有困惑.

我有类Vector2,Vector3其中包含operator+=(以下面的方式定义).

   Vector2& operator+=(const Vector2& v) {

      x() += v.x(), y() += v.y();

      return *this;
   }
Run Code Online (Sandbox Code Playgroud)

现在我想添加泛型添加行为并说出如下内容:

template <typename V> const V operator+(const V& v1, const V& v2) {
   return V(v1) += v2;
}
Run Code Online (Sandbox Code Playgroud)

这编译很好,适用于Vector2Vector3.但是,假设我想为我做一个稍微高效的"+"操作,我Vector2希望它采用以下方式(使用模板特化):

template<> const Vector2 operator+(const Vector2& v1, const Vector2& v2) {
   return Vector2(v1.x() + v2.x(), v1.y() + v2.y());
}
Run Code Online (Sandbox Code Playgroud)

这看起来很好,但遗憾的是,将这两个代码块放在一起使得代码无法编译

(链接器说错误LNK2005: "Vector2 const operator+<Vector2>(Vector2 const &,Vector2 const &)" (??$?HVVector2@core@lf@@@core@lf@@YA?BVVector2@01@ABV201@0@Z) already defined in ...)

我的错误是什么,我哪里出错了?

谢谢.

Mik*_*our 7

如果特化是在头文件中,那么您需要声明它inline以允许它包含在多个编译单元中.

请注意,您实际上并不需要模板专业化; 一个简单的重载将做同样的事情.

  • 过载永远是一个更好的选择. (2认同)