我对模板特化有点困惑。

我有 Vector2Vector3 类,其中包含 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;
}

这编译得很好并且适用于 Vector2Vector3 。但是,假设我希望对我的 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 ... )

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

谢谢你。

最佳答案

如果特化在一个头文件中,那么你需要将它声明为 inline 以允许它被包含在一个以上的编译单元中。

请注意,这里实际上并不需要模板特化;一个简单的重载会做同样的事情。

关于C++基本模板题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3255339/

10-12 06:22