<cmath> 在我的函数模板中无法调用 sqrt 函数
<cmath> sqrt function cannot be invoked in my function template
我正在尝试编写一个函数模板,它从 stdin 接收一个数字作为参数并对其执行平方根运算,除非它恰好为负数,在这种情况下将抛出异常。主程序如下所示:
#include "Sqrt _of_Zero_Exception.h"
#include <iostream>
#include <cmath>
using namespace std;
template <typename T>
const T& sqrtNumber(T&);
int main()
{
int a, result;
cout << "Enter number to square root: ";
while (cin >> a){
try{
result = sqrtNumber(a);
cout << "The square root of " << a << " is " << result << endl;
} //end try
catch (SqrtofZeroException &sqrtEx){
cerr << "An exception occurred: " << sqrtEx.what() << endl;
} //end catch
}
return 0;
}
template <typename T>
const T& sqrtNumber(T& num)
{
if (num < 0)
throw SqrtofZeroException();
return sqrt(num);
}
这是头文件:
#include <stdexcept>
//SqrtofZeroException objects are thrown by functions that detect attempts to square root negative numbers
class SqrtofZeroException : public std::runtime_error
{
public:
SqrtofZeroException() //constructor specifies default error message
: runtime_error("square root on a negative number is not allowed"){}
}; //end class SqrtofZeroException
该程序可以在 Visual Studio 上编译,但是当我尝试在我的 sqrtNumber
函数中调用它时 <cmath> sqrt
函数是灰色的:
而且我运行程序输出错误:
如果我将函数模板更改为接受整数参数的普通函数,我可以毫无问题地调用 sqrt
。那么这种行为的确切原因是什么?我的函数模板语法有问题吗?
sqrt 以双精度作为参数。它不会让您为此使用模板,因为 T 可以是任何东西。因为取平方根是没有意义的,例如,一个指针,它不会让你为此使用模板。取一个double,任何数字都可以转换成那个。
我正在尝试编写一个函数模板,它从 stdin 接收一个数字作为参数并对其执行平方根运算,除非它恰好为负数,在这种情况下将抛出异常。主程序如下所示:
#include "Sqrt _of_Zero_Exception.h"
#include <iostream>
#include <cmath>
using namespace std;
template <typename T>
const T& sqrtNumber(T&);
int main()
{
int a, result;
cout << "Enter number to square root: ";
while (cin >> a){
try{
result = sqrtNumber(a);
cout << "The square root of " << a << " is " << result << endl;
} //end try
catch (SqrtofZeroException &sqrtEx){
cerr << "An exception occurred: " << sqrtEx.what() << endl;
} //end catch
}
return 0;
}
template <typename T>
const T& sqrtNumber(T& num)
{
if (num < 0)
throw SqrtofZeroException();
return sqrt(num);
}
这是头文件:
#include <stdexcept>
//SqrtofZeroException objects are thrown by functions that detect attempts to square root negative numbers
class SqrtofZeroException : public std::runtime_error
{
public:
SqrtofZeroException() //constructor specifies default error message
: runtime_error("square root on a negative number is not allowed"){}
}; //end class SqrtofZeroException
该程序可以在 Visual Studio 上编译,但是当我尝试在我的 sqrtNumber
函数中调用它时 <cmath> sqrt
函数是灰色的:
而且我运行程序输出错误:
如果我将函数模板更改为接受整数参数的普通函数,我可以毫无问题地调用 sqrt
。那么这种行为的确切原因是什么?我的函数模板语法有问题吗?
sqrt 以双精度作为参数。它不会让您为此使用模板,因为 T 可以是任何东西。因为取平方根是没有意义的,例如,一个指针,它不会让你为此使用模板。取一个double,任何数字都可以转换成那个。