三角函数的模板重载

时间:2017-11-13 17:37:08

标签: c++ templates

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

我做了以下简单示例,它给出了堆栈损坏,我无法弄清楚原因。任何提示

#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得到了同样的错误。

提前致谢 延

1 个答案:

答案 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); } 
                                  ^^^
相关问题