三角函数的模板重载

template overload of trigonometric functions

本文关键字:重载 三角函数      更新时间:2023-10-16

我正在开发一个更大的库,我希望能够更改使用的浮点精度。三角函数在很多地方都有使用,所以我决定包括模板化的包装器,例如正弦和余弦。

做了以下简单的例子,它给出了堆栈损坏,我无法弄清楚为什么。任何提示

#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 时遇到相同的错误。

提前致谢延斯

你得到一个无穷大递归:

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