Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 三角函数的模板重载_C++_Templates - Fatal编程技术网

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调用不同精度的函数了吗。