请问下面这两个报错与没报错的代码有啥区别啊,有人能细讲一下吗?

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#include <iostream>

using namespace std;

template <typename T>
int count(T a[],int n,T value);

int main()
{
    // float a[5] = {1.23,2.34,2.34,3.34,4.34};
    // float valu = 2.34;
    // int c ;

    // // c = count(a,5,valu);          //没报错
    // c = count(a,5,2.34);              //报错


    // cout << c << endl;

    int a[7] = {1,2,3,4,5,5,5};
    int b;

    b = count(a,7,5);
    cout << b << endl;
}

template <typename T>
int count(T a[],int n,T value)
{
    int final_result = 0;

    for(int i = 0;i < n; i++)
    {
        if(a[i] == value)
            final_result++;
    }
    return final_result;

}###### 运行结果及报错内容

我的解答思路和尝试过的方法
我想要达到的结果

// c = count(a,5,valu); //没报错
// c = count(a,5,2.34); //报错
这两句,第一句中,a和valu都是float,模板中T对应float类型
第二句中,a是float类型,但是2.34默认是double类型,模板类型T无法完全匹配,所以报错

参数类型的匹配说明:
函数参数中直接写数字的时候,编译器会自动匹配最优类型,如果是2,默认匹配int类型,如果是2.34,默认匹配double类型,不是匹配float类型,因为doble类型比float类型精度更高,编译器会择优处理,2.34默认匹配为double类型

区别在于 一个是变量(valu) 一个是常量(2.34)

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632