不同点:

    是否可以发生类型隐式转换


    普通函数与函数模板区别:**

    • 普通函数调用时可以发生自动类型转换(隐式类型转换)
      1. #include <iostream>
      2. using namespace std;
      3. int myAdd(int a,int b){
      4. return a + b;
      5. }
      6. int main(){
      7. int a = 10;
      8. int b = 10;
      9. char c = 'c';
      10. cout << myAdd(a,b) << endl;
      11. cout << myAdd(a,c) << endl;
      12. system("pause");
      13. return 0;
      14. }
      image.png
    • 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换

      1. #include <iostream>
      2. using namespace std;
      3. template<typename T>
      4. T myAdd(T a,T b){
      5. return a + b;
      6. }
      7. int main(){
      8. int a = 10;
      9. int b = 10;
      10. char c = 'c';
      11. //cout << myAdd(a,b) << endl;
      12. cout << myAdd(a,c) << endl; // 错误
      13. system("pause");
      14. return 0;
      15. }

      image.png

    • 如果利用显示指定类型的方式,可以发生隐式类型转换

      1. #include <iostream>
      2. using namespace std;
      3. template<typename T>
      4. T myAdd(T a,T b){
      5. return a + b;
      6. }
      7. int main(){
      8. int a = 10;
      9. int b = 10;
      10. char c = 'c';
      11. // cout << myAdd(a,b) << endl;
      12. cout << myAdd<int>(a,c) << endl; // 指定数据类型为整形,那么就会把字符型隐式转换为整形
      13. system("pause");
      14. return 0;
      15. }


    **运行过程中自动将字符型隐式转换成了整型数据

    示例:

    1. //普通函数
    2. int myAdd01(int a, int b)
    3. {
    4. return a + b;
    5. }
    6. //函数模板
    7. template<class T>
    8. T myAdd02(T a, T b)
    9. {
    10. return a + b;
    11. }
    12. //使用函数模板时,如果用自动类型推导,不会发生自动类型转换,即隐式类型转换
    13. void test01()
    14. {
    15. int a = 10;
    16. int b = 20;
    17. char c = 'c';
    18. cout << myAdd01(a, c) << endl; //正确,将char类型的'c'隐式转换为int类型 'c' 对应 ASCII码 99
    19. //myAdd02(a, c); // 报错,使用自动类型推导时,不会发生隐式类型转换
    20. myAdd02<int>(a, c); //正确,如果用显示指定类型,可以发生隐式类型转换
    21. }
    22. int main() {
    23. test01();
    24. system("pause");
    25. return 0;
    26. }