我在标题
中有这个代码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;忽略第二个定义
但是,如果我使用相同的,但我放了双倍,而不是浮动,它编译正确。这里有什么不对,我错过了?
答案 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);
};
(我冒昧地将其更改为命名空间,而不是类,因为这更有意义。如果您确实希望它出于某种原因而成为一个类,那么您必须声明专业化在外面的命名空间。)
否则,在其他翻译单元中使用它将导致它从通用模板实例化,因为编译器不知道显式特化存在。这会导致多种定义。