三角函数的模板重载
template overload of trigonometric functions
我正在开发一个更大的库,我希望能够更改使用的浮点精度。三角函数在很多地方都有使用,所以我决定包括模板化的包装器,例如正弦和余弦。
我做了以下简单的例子,它给出了堆栈损坏,我无法弄清楚为什么。任何提示
#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); }
^^^
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 三角函数的模板重载