C++ 三角函数的模板重载
我正在开发一个更大的库,在那里我希望能够更改使用的浮点精度。三角函数在很多地方都有使用,所以我决定使用模板包装,例如正弦和余弦 我已经做了以下简单的例子,它给出了一个堆栈损坏,我不知道为什么。有什么提示吗C++ 三角函数的模板重载,c++,templates,C++,Templates,我正在开发一个更大的库,在那里我希望能够更改使用的浮点精度。三角函数在很多地方都有使用,所以我决定使用模板包装,例如正弦和余弦 我已经做了以下简单的例子,它给出了一个堆栈损坏,我不知道为什么。有什么提示吗 #include <cmath> #include <iostream> namespace sps { template <typename T> inline T sin(const T& v) { return sin(v); } temp
#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;
}
#包括
#包括
命名空间SP{
模板
内联T sin(const T&v){返回sin(v);}
模板
内联T cos(const T&v){返回cos(v);}
模板
内联浮点sin(const float&v){返回sinf(v);}
模板
内联浮点cos(const float&v){return cosf(v);}
}//名称空间sps
模板浮点sps::sin(常量浮点和v);
模板浮点sps::cos(常量浮点和v);
模板双SP::sin(const double&v);
模板双SP::cos(常数双和v);
int main()
{
双d=2.0;
std::cout您将得到无穷递归:
template <typename T>
inline T sin(const T& v) { return sin(v); } // keep calling sin
模板
内联T sin(const T&v){返回sin(v);}//继续调用sin
您需要将返回值更改为:
template <typename T>
inline T sin(const T& v) { return std::sin(v); }
^^^
模板
内联tsin(const T&v){return std::sin(v);}
^^^
您得到的是无限递归:
template <typename T>
inline T sin(const T& v) { return sin(v); } // keep calling sin
模板
内联T sin(const T&v){返回sin(v);}//继续调用sin
您需要将返回值更改为:
template <typename T>
inline T sin(const T& v) { return std::sin(v); }
^^^
模板
内联tsin(const T&v){return std::sin(v);}
^^^
template T sin(const T&v){return sin(v);}
是无限递归的……模板(非专用的)sin
和cos
函数,你认为它们调用什么函数?你知道递归吗?什么是sps
?顺便问一下,你确定你想要模板而不是简单的重载吗?难道sin(x)
所有准备好的调用不同精度函数的std::sin(float),std::sin(double)
?@chux.模板tsin(const T&v){返回sin(v);}
是无限递归的…模板(非专用)sin
和cos
函数,你认为它们调用什么函数?你知道递归吗?什么是sps
?顺便问一句,你确定你想要模板而不是简单的重载吗?难道sin(x)
都准备好用std::sin(float),std::sin(double)
?@chux调用不同精度的函数了吗。