使用float的C ++模板专业化

时间:2014-12-23 10:54:59

标签: c++ templates

我在标题

中有这个代码
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&amp;,float const&amp;)“   (?? $ IsEqual @ M @ MyMathUtils @ MyMath @@ SA_NABM0 @ Z)已定义于   MyMathUtils.obj;忽略第二个定义

但是,如果我使用相同的,但我放了双倍,而不是浮动,它编译正确。这里有什么不对,我错过了?

1 个答案:

答案 0 :(得分:1)

您需要在标头中声明特化。

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);
};

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

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