<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,任何数字都可以转换成那个。