我在我自己的数学库上工作,我在用于库的命名空间中有几个非成员函数(" cml",就像它重要一样许多)。无论如何,库(我将静态构建为.a / .lib文件)编译得很好,但是当我在测试程序中使用库时,我得到一个错误,即函数是未定义的引用。
这是标题(func.h)文件:
namespace cml
{
template <typename T>
T toRadians(T val);
template <typename T>
T toDegrees(T val);
template <typename T>
T fastSqrt(T val);
template <typename T>
T fastInverseSqrt(T val);
}
这是func.cpp文件:
#include <CML/func.h>
#include <cmath>
#include <math.h>
#include <limits>
#include <cassert>
namespace cml
{
template <typename T>
T toRadians(T val)
{
static_assert(std::numeric_limits<T>::is_iec559, "toRadians() requires the template parameters to be floating points.");
return val * MATH_PI / 180;
}
template <typename T>
T toDegrees(T val)
{
static_assert(std::numeric_limits<T>::is_iec559, "toDegrees() requires the template parameters to be floating points.");
return val * 180 / MATH_PI;
}
template <typename T>
T fastSqrt(T val)
{
static_assert(std::numeric_limits<T>::is_iec559, "fastSqrt() requires the template parameters to be floating points.");
return T(1) / fastInverseSqrt(val);
}
template <typename T>
T fastInverseSqrt(T val)
{
static_assert(std::numeric_limits<T>::is_iec559, "fastInverseSqrt() requires the template parameters to be floating points.");
T tmp = val;
T half = val * T(0.5);
uint32* p = reinterpret_cast<uint32*>(const_cast<T*>(&val));
uint32 i = 0x5f3759df - (*p >> 1);
T* ptmp = reinterpret_cast<T*>(&i);
tmp = *ptmp;
tmp = tmp * (T(1.5) - half * tmp * tmp);
#if defined(CML_ACCURATE_FUNC) // If more accuracy is requested, run Newton's Method one more time
tmp = tmp * (T(1.5) - half * tmp * tmp);
#endif // defined
return tmp;
}
}
我收到了所有四个函数的错误。我在Windows8上使用最新版本的Code :: Blocks和GCC。我正在为Win32编译。我已经尝试了不同的建议,我发现它们可以标记功能extern
,但它似乎无法修复它。我确信它很简单,我很遗憾,如果是这样的话,第二双眼睛可能有所帮助。
错误:undefined reference to
float cml :: toRadians(float)&#39;`
答案 0 :(得分:2)
您需要在头文件中定义模板函数。我会做的是
#include "func.inl"
添加到func.h的底部。模板函数不像常规函数那样编译,而是由稍后的编译阶段(如内联函数)处理。