C++ 具有浮点数的模板专用化

C++ Template specialization with float

本文关键字:专用 浮点数 C++      更新时间:2023-10-16

我在标题中有这段代码

class MyMathUtils {
   template <typename T> static bool IsEqual(const T & val1, const T & val2);
};

template <typename T>
bool MyMathUtils::IsEqual(const T & val1, const T & val2)
{
    return (val1 == val2);
};

这在 cpp 中

template <>
bool MyMathUtils::IsEqual<float>(const float & val1, const float & val2)
{
    if ((val1 - val2) < -EPSILON) return false;
    if ((val1 - val2) > EPSILON) return false;
    return true;
}

问题是,编译器给了我这个错误:

MyMath::MyMathUtils::IsEqual(float const &,float const &)" (??$IsEqual@M@MyMathUtils@MyMath@@SA_NABM0@Z) 已在 中定义 MyMathUtils.obj;忽略第二个定义

但是如果我使用相同的,但我放了双精度而不是浮点数,它被正确编译。这里有什么不正确的,我错过了?

您需要在标头中声明专用化。

namespace MyMathUtils {
   // generic template (shouldn't be static)
   template <typename T> bool IsEqual(const T & val1, const T & val2);
   // explicit specialisation
   template <> bool IsEqual<float>(const float & val1, const float & val2);
   // alternatively, overloading would be simpler
   bool IsEqual(float, float);
};

(我冒昧地将其更改为命名空间,而不是类,因为这更有意义。如果你出于某种原因确实希望它是一个类,你必须在外面的命名空间中声明专用化。

否则,在其他翻译单元中使用它将导致它从泛型模板实例化,因为编译器不知道显式专用化的存在。这会导致多个定义。