[Notas de estudio de C++] 1. El concepto y el uso básico de las plantillas (y la solución a la llamada a 'intercambiar' es un informe de error ambiguo)

1. Plantilla

1.1 El concepto de plantilla

Las plantillas son la base de la programación genérica, que consiste en escribir código de forma independiente de cualquier tipo en particular.
También puede entenderse como un plano o fórmula de una función. Los contenedores de biblioteca, como los iteradores y los algoritmos, son ejemplos de programación genérica y ambos usan el concepto de plantillas.

Características: fuerte versatilidad.

1.2 plantilla

  • Otra idea de programación en C++ se llama programación genérica, y la principal tecnología utilizada son las plantillas.

  • C++ proporciona dos mecanismos de plantillas: plantillas de funciones y plantillas de clases.

1.2.1 Sintaxis de plantilla de función

Rol de plantilla de función:

Para establecer una función general, su tipo de valor de retorno de función y su tipo de parámetro formal no pueden formularse específicamente, pero pueden representarse mediante un tipo virtual.

gramática:

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

Explicación:
plantilla — declaración para crear una plantilla

typename — el símbolo detrás de él es un tipo de datos, que puede ser reemplazado por clase

T: tipo de datos generales, el nombre se puede reemplazar, generalmente en letras mayúsculas

ejemplo

/***************************************
*@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();
}

Se puede ver que solo se necesita una plantilla en este momento para completar el intercambio de dos datos del mismo tipo, sin escribir una función de intercambio para cada tipo de datos, que es exactamente la característica de las plantillas: la universalidad.

En este momento, cuando se llama a la función swapNumber(), se inserta automáticamente en el tipo de parámetro y el tipo de datos también se puede especificar manualmente.

Especificar manualmente el tipo de datos

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

Hubo un error al escribir este caso, el código es el siguiente:

caso de error

//函数模板
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();
}

Ocurrió un error al llamar a la función de plantilla swap(), y el mensaje de error fue "la llamada a 'swap' es ambigua". Después de investigar, se descubrió que entraba en conflicto con el nombre de la función de biblioteca de C++, por lo que era cambiado a swapNumber y resuelto.

! Así que debes prestar atención a la estandarización de los nombres~~

Supongo que te gusta

Origin blog.csdn.net/w646645452/article/details/126859469
Recomendado
Clasificación