我正在开发一个更大的库,我希望能够更改所使用的浮点精度。三角函数在很多地方使用,所以我决定将模板包装用于例如正弦和余弦。
我做了以下简单示例,它给出了堆栈损坏,我无法弄清楚原因。任何提示
#include <cmath>
#include <iostream>
namespace sps {
template <typename T>
inline T sin(const T& v) { return sin(v); }
template <typename T>
inline T cos(const T& v) { return cos(v); }
template <>
inline float sin<float>(const float& v) { return sinf(v); }
template <>
inline float cos<float>(const float& v) { return cosf(v); }
} // namespace sps
template float sps::sin(const float& v);
template float sps::cos(const float& v);
template double sps::sin(const double& v);
template double sps::cos(const double& v);
int main()
{
double d = 2.0;
std::cout << sps::sin(d) << std::endl; /* (*) */
float f = 2.0f;
std::cout << sps::sin(f) << std::endl;
return 0;
}
如果我明确说明要使用哪些功能,例如sps :: sin(f),我仍然得到堆栈损坏。使用星号(*)抛出堆栈损坏。如果我省略显式实例化,则仍会发生堆栈损坏。我尝试将输入更改为按值,但这也没有效果。
我使用gcc 6.3.0和MSCV 2017得到了同样的错误。
提前致谢 延
答案 0 :(得分:2)
您正在进行无限递归:
template <typename T>
inline T sin(const T& v) { return sin(v); } // keep calling sin
您需要将返回值更改为:
template <typename T>
inline T sin(const T& v) { return std::sin(v); }
^^^