【C++学习笔记】1.模板的概念及基本使用 (以及call to ‘swap‘ is ambiguous报错的解决)

1.模板

1.1模板的概念

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。
也可以理解为函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。

特点:通用性强

1.2模板

  • C++另一种编程思想称为泛型编程,主要利用的技术就是模板

  • C++提供两种模板机制:函数模板和类模板

1.2.1函数模板语法

函数模板作用:

建立一个通用函数,其函数返回值类型和形参类型可以不具体制定,用一个虚拟的类型来代表。

语法:

template<typename T>
//函数声明或定义

解释:
template — 声明创建模板

typename — 表面其后面的符号是一种数据类型,可以用class代替

T — 通用的数据类型,名称可以替换,通常为大写字母

示例

/***************************************
*@File    :template.cpp
*@IDE     :CLion 
*@Author  :lingxiaotian
*@Date    :2022/9/14 19:37 
***************************************/

#include "iostream"
#include <string>
using namespace std;

//函数模板
template<class T>
//交换两个数的模板
void swapNumber(T &a,T &b){
    
    
    T temp = a;
    a = b;
    b = temp;
}
//整型交换
void test(){
    
    
    int a = 8;
    int b = 12;
    swapNumber(a,b);
    cout<<"交换后a的值是:"<<a<<endl;
    cout<<"交换后b的值是:"<<b<<endl;
}
//浮点交换
void test1(){
    
    
    float a = 100.86;
    float b = 124.01;
    swapNumber(a,b);
    cout<<"交换后a的值是:"<<a<<endl;
    cout<<"交换后b的值是:"<<b<<endl;
}
//字符串交换
void test2(){
    
    
    string a = "我原本是个a~";
    string b = "我他喵的是b啊!";
    swapNumber(a,b);
    cout<<"交换后a的值是:"<<a<<endl;
    cout<<"交换后b的值是:"<<b<<endl;
}

int main(){
    
    
    test();
    test1();
    test2();
}

可以看到此时只需要使用一个模板,即可完成两个相同类型数据的交换,而不为每种数据类型分别写出交换函数,这也正是模板的特点——泛用性。

此时调用函数swapNumber()时是使其自动推到参数的类型,还可以手动指定数据类型。

手动指定数据类型

//字符串交换
void test2(){
    
    
    string a = "我原本是个a~";
    string b = "我他喵的是b啊!";
//手动指定数据类型
    swapNumber<string>(a,b);
    cout<<"交换后a的值是:"<<a<<endl;
    cout<<"交换后b的值是:"<<b<<endl;
}

写该案例时出现过一个报错,代码如下:

报错案例

//函数模板
template<class T>
//交换两个数的模板
void swap(T &a,T &b){
    
    
    T temp = a;
    a = b;
    b = temp;
}
//整型交换
void test(){
    
    
    int a = 10;
    int b = 123;
  
    swap(a,b); //!!!此处报错,call to 'swap' is ambiguous!!
  
    cout<<"交换后a的值是:"<<a<<endl;
    cout<<"交换后b的值是:"<<b<<endl;
}
int main(){
    
    
    test();
}

在调用模板函数swap()时出现错误,错误提示为“call to ‘swap’ is ambiguous”,研究后发现是与c++自身的库函数名冲突,于是改为swapNumber后解决。

!所以诸位一定要注意命名的规范性呐~~

猜你喜欢

转载自blog.csdn.net/w646645452/article/details/126859469