首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

一、普通函数 与 函数模板 的调用规则 - 类型匹配 1、类型匹配 上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板...与 传入实参 类型匹配的 情况下 , 优先调用 普通函数 , 如果 普通函数 无法匹配 则考虑调用 函数模板 ; 2、代码示例 - 类型匹配 代码示例 : #include "iostream" using...如果 符合 普通函数类型参数要求 , 优先调用普通函数 ; // 如果 没有 符合要求的 普通函数 , 则查看 模板函数 能否匹配 ; // 如果 模板函数 仍不能匹配 , 则查看 普通函数 类型转换能否匹配...参数类型 能 匹配 普通函数 , 也要调用 函数模板 ; 在下面的代码示例中 , 传入的实参类型 都是 int 类型 , 完全符合 普通函数的 调用规则 , 但是 使用 显示指定了 函数模板...endl; return a + b; } // 普通函数 , 函数模板 调用 优先级 // 函数模板 会进行 严格类型匹配 , 不会进行 类型转换 ; // // 如果 符合 普通函数类型参数要求

20240

【Kotlin】函数类型 ( 函数类型 | 带参数名称的参数列表 | 可空函数类型 | 复杂函数类型 | 带接收者函数类型 | 函数类型别名 | 函数类型实例化 | 函数调用 )

函数类型 II . 带参数名的参数列表 III . 可空函数类型 IV . 复杂函数类型解读 V . 函数类型别名 VI . 带 接收者类型 的函数类型 VII . 函数类型实例化 VIII ....-> 返回值类型 ① 参数列表 : 参数类型的列表 , 多个参数类型使用逗号隔开 ; ② -> 符号 : 由参数列表指向返回值类型 , 该符号用于分割参数类型列表 与 返回值类型 ; ③ 返回值类型...有参数名称的函数类型 : 参数列表中每个元素都由 参数名称 : 参数类型 组成 , 多个列表元素使用逗号隔开 ; ( 参数名称1 : 参数类型1 , 参数名称2 : 参数类型2 , … 参数名称n :...函数类型 实例的接收者 , 该对象拥有该函数 ; ② 上述的 函数类型 定义 表示 : 接收者类型 对象 , 调用 ( 参数类型列表 ) -> 返回值类型 函数类型的函数 , 传入 ( 参数类型列表 )...函数类型实例化 ---- 函数类型 变量实例化 : 给 函数类型变量 进行赋值 , 可以赋值的类型有以下几种情况 ; 1 .

2.8K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    c++私有变量和公有变量_没有与指定类型匹配的重载函数实例

    accessor和mutator主要用来实现数据的封装,有了accessor和mutator,我们就可以将数据成员设为私有,所有对它们的读写操作都通过这两个函数来实现。...public: int getId();//accessor function,是只读性质的函数 void setId(int id);//mutator function,是只写性质的函数...}; 函数形参与类私有成员重名的解决方法 ---- #include class retangle{ private: double width; double...height = height;//error return; } }; 但是我们会发现这样是行不通的,会出现编译错误,原因大概是,编译器把两个width和height都当成是传进函数的参数...width和height,而不是传进去的参数,从而不会引起混淆。

    1.3K20

    【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体的类型参数列表 | 继承 类模板 必须重写构造函数 )

    一、普通类 继承 类模板语法 1、普通类 继承 类模板语法 类模板 作为父类 , 子类 继承 类模板 父类 , 需要 指定 具体的类型参数列表 ; 需要 重写 构造函数 , 其中必须调用 类模板 具体类...的 子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小...} public: int b; }; 2、继承类模板必须指定具体的类型参数列表 定义 类模板 , // 声明 类模板 父类 template class Father..., 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 被继承的 类模板 必须 声明 类型参数列表 , 将具体的泛型类型写在尖括号中..., 调用 类模板 具体类 的构造函数 , 如果 子类 继承 类模板父类 , 如果 子类没有实现 构造函数 , // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板 的 类型参数列表

    1.1K31

    函数模板 ## 函数模板

    过程:创建候选函数列表。其中包含与被调⽤函数的名称相同的函数和模板函数。使⽤候选函数列表创建可⾏函数列表。...例如,使⽤float参数的函数调⽤可以 将该参数转换为double,从⽽与double形参匹配,⽽模板可以为 float⽣成⼀个实例。确定是否有最佳的可⾏函数。如果有,则使⽤它,否则该函数调⽤出错。...编译器必须确定哪个可⾏函数是最佳的。它查看为使函数调⽤参数与可⾏的候选函数的参数匹配所需要进⾏的转换。通常,从最 佳到最差的顺序如下所述。完全匹配,但常规函数优先于模板。...完全匹配和最佳匹配 Type(argument-list)意味着⽤作实参的函数名与⽤作形 参的函数指针只要返回类型和参数列表相同,就是匹配的。 !...- 如果函数定义是在使⽤函数前提供的,它将充当函数原型。多个参数的函数 编译器必须考虑所有参数的匹配情况

    2.2K10

    模版初阶

    模板函数因为匹配度更高或者更具体而被优先选择 当调用一个函数时,编译器首先尝试找到一个非模板函数与传入的参数类型完全匹配。...Test() { Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化 Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的...所以,正确的语法格式是先指明模板参数列表,然后是类名(包括模板参数),接着是成员函数的名称和其他参数列表。...template 声明这是一个模板函数定义,T 是模板参数,它必须与Stack类模板中的参数类型相匹配。 Stack:: 表示这是类Stack的一个成员函数。...由于Stack是一个模板类,所以在类名后面紧跟模板参数列表,以明确指出我们正在定义的是模板类Stack的成员函数。 接下来是构造函数的名称Stack及其参数列表(size_t capacity)。

    6100

    【C++】模板初阶:泛型编程的起点

    2.2格式 函数模板的语法如下所示: //单个模板参数 template 返回类型 函数名(参数列表) { // 函数体 } //多个模板参数 template<typename...return 0; } 这样不管后面的形参时什么类型,编译器都会实例化为int类型的Add函数; 2.5 模板参数的匹配原则 ✨ 1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数...Test() { Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化 Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add函数...类模板 3.1概念 类模板是一种通用的类定义,可以实例化为多个具体的类。类模板中可以包含通用的成员变量、成员函数和成员类型。...通过类模板,可以定义出与类型无关的通用类,使得代码可以复用,同时也能满足不同类型的需求。 3.2格式 类模板的定义一般使用关键字template,后跟模板参数列表。

    13410

    【C++】泛型编程 ② ( 函数模板与普通函数区别 )

    一、函数模板与普通函数区别 1、函数模板与普通函数区别 函数模板与普通函数区别 : 主要区别在于它们能够处理的 数据类型数量 和 灵活性 ; 自动类型转换 : 函数模板 不允许 自动类型转化 , 会进行严格的类型匹配...等类型 ; 函数模板 可以接受 任何类型 的参数 , 函数模板在 C++ 编译器 编译时 将类型参数实例化 , 生成对应的 普通函数 ; 灵活性 : 普通函数 对于 不同的 数据类型参数 需要单独定义...: 普通函数 直接定义 返回类型 , 函数名 , 参数列表 , 函数体 , 即可 完成函数定义 , 如 : int add(int a, int b){} ; 函数模板 先使用 template... 声明泛型 , 后面跟着 返回类型 , 函数名 , 参数列表 , 函数体 , 等内容 , 在 函数的 参数列表 返回类型 中可使用 声明的 泛型类型 , 如 : T add(T...a, T b){} ; 函数模板实例化 : 使用函数模板时 , C++ 编译器会根据 实际传入的 参数类型 自动实例化相应的函数 ; 如 : 定义的 T add(T a, T b) 类型的 函数模板

    24350

    模版初阶

    ,typename Tn> 返回值类型 函数名(参数列表){} 每一个T代表一种数据类型,一个模版对应一个函数 注意:typename是用来定义模板参数关键字,**也可以使用class(**切记:不能使用...此时有两种处理方式: 强制转化 使用显式实例化 Add(a, (int)d); 显式实例化 在函数名后的中指定模板参数的实际类型 具体格式格式示例如下: Add(a, b); 模板参数的匹配原则...如果一个函数模板可以被实例化成一个与另一个具有相同名称和签名的非模板函数,编译器将根据调用的参数类型来选择最合适的函数版本。...如果模板实例化的结果与非模板函数的签名完全匹配,并且没有其他更好的匹配项,编译器通常会优先选择非模板函数,因为它是更具体的实例。...; } **注意:**上述代码中的加法模板函数有两个不同的参数 Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化 Add(1, 2.0); // 模板函数可以生成更加匹配的版本

    7710

    【C++】C++模板基础知识篇

    函数模板 2.1 函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。 2.2 函数模板格式 函数模板传的是类型。...2.5 模板参数的匹配原则 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数 template T Add(const T& left, const...() { Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化 Add(1, 2.0); // 模板函数可以生成更加匹配的版本,编译器根据实参生成更加匹配的Add...类模板 3.1 类模板的定义格式 模板有多个参数时,用“,”分隔。...类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。

    11210

    C++初阶:入门泛型编程(函数模板和类模板)

    T>:使用template关键字定义函数模板,并在尖括号中指定一个或多个类型参数. typename是用来定义模板参数关键字,也可以使用class functionName:函数模板的名称。...:函数模板的参数列表,参数类型为通用的类型T 单模版参数: template void Swap(T& a, T& b) { T temp = a; a = b; b = temp...该语句不能通过编译,因为在编译期间,当编译器看到该实例化时,需要推演其实参类型 通过实参a1将T推演为int,通过实参d1将T推演为double类型,但模板参数列表中只有一个T,编译器报错 此时有两种处理方式...(10);//此时必须显示实例化,不然没有办法推测T是什么类型 return 0; } 2.5 模板参数的匹配原则 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数...现在不一样了 return 0; } 3.3类模板的实例化 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

    23710

    第 16 章 模板与泛型编程

    对于这种参数,对实参进行正常的类型转换。 当函数返回类型与参数列表中任何类型都不相同时,编译器无法推断出模板实参的类型或者希望允许用户控制模板实例化,可以指定显式模板实参。...显式模板实参按由左至右的顺序与对应的模板参数匹配,推断不出的模板参数的类型在定义时应该放在参数列表的最左边。...与往常一样,如果恰有一个函数提供比任何其他函数都更好的匹配,则选择此函数。但是如果有多个函数提供同样好的匹配,则: 如果同样好的函数中只有一个是非模板函数,则选择此函数。...可变数目的参数被称为参数包。存在两种参数包:模板参数包,表示零个或多个模板参数;函数参数包表示零个或多个函数参数。...在一个模板参数列表中,class...或 typename...指出,接下来的参数表是零个或多个类型的列表;一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数的列表。

    1.4K60

    第 16 章 模板与泛型编程

    对于这种参数,对实参进行正常的类型转换。 当函数返回类型与参数列表中任何类型都不相同时,编译器无法推断出模板实参的类型或者希望允许用户控制模板实例化,可以指定显式模板实参。...显式模板实参按由左至右的顺序与对应的模板参数匹配,推断不出的模板参数的类型在定义时应该放在参数列表的最左边。...与往常一样,如果恰有一个函数提供比任何其他函数都更好的匹配,则选择此函数。但是如果有多个函数提供同样好的匹配,则: 如果同样好的函数中只有一个是非模板函数,则选择此函数。...可变数目的参数被称为参数包。存在两种参数包:模板参数包,表示零个或多个模板参数;函数参数包表示零个或多个函数参数。...在一个模板参数列表中,class...或 typename...指出,接下来的参数表是零个或多个类型的列表;一个类型名后面跟一个省略号表示零个或多个给定类型的非类型参数的列表。

    1.5K20

    C++ 初识函数模板

    初识函数模板2.1 语法在重构上述代码时,先了解一下函数模板的语法结构:template 模板形式参数列表> 返回类型 函数名(函数形式参数列表){函数体}语法结构说明:template关键字说明了此函数是一个函数模板...Tips:模板参数列表中的参数可以是一个或多个泛化数据类型参数,也可以是一个或多个具体数据类型参数。泛化类型参数前面要加上 typename 关键字。...重载函数模板C++中普通函数和函数模板可以一起重载,面对多个重载函数,编译器需要提供相应的匹配策略。...:如果函数模板能实例出一个完全与函数实参类型相匹配的函数,那么就会选择函数模板,如getMax(2.4,6.8); 调用。...编译器会根据函数模板实例化一个double getMax(double a,double b)函数与需求完全相匹配的函数。

    62040

    C++模板(初阶)

    泛型编程 2.函数模板 2.1函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3.类模板 3.1 类模板的定义格式 3.2 类模板的实例化...函数模板 2.1 函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。...return 0; } 如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错 2.5 模板参数的匹配原则 1....对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模板 3....= 0; } 3.2 类模板的实例化 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类 //

    39530

    【C++】初识模板

    ,typename Tn> 返回值类型 函数名(参数列表) {} (这里typename也可以写成class,为了保持与stl库里(SGI版本)的源码格式一致,我们采用class) 上面的函数便可以写成以下这种形式...匹配原则 假如一个非模板函数与同名的模板函数同时存在,并且模板函数可以实例化出与非模板函数相同的函数,此时编译器会调用哪一个呢? 答:最优匹配的那一个,并且假如其余条件都相同,编译器会调用非模板函数。...如下验证: //匹配原则:最优原则匹配,假如条件都相同,会匹配非模板函数 //非模板函数,专门处理int类型 int Add(int left, int right) { cout 模板的存在则可以解决这个问题。 类模板中的成员函数定义方式: 在类中声明,在类外定义,定义时需要加上模板参数列表。...类模板在类中声明,类外定义时,需要加模板参数列表 end 生活原本沉闷,但跑起来就会有风!

    54630

    C++-模板基础

    函数模板 2.1 函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本。...2.4 函数模板的实例化 用不同类型的参数使用函数模板时 ,称为函数模板的 实例化 。模板参数实例化分为: 隐式实例化和显式实例 化 。 1....2.5 模板参数的匹配原则 1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。...T2> T1 Add(T1 left, T2 right) { return left + right; } void Test() { Add(1, 2); // 与非函数模板类型完全匹配,不需要函数模板实例化...= 0; } 3.2 类模板的实例化 类模板实例化与函数模板实例化不同, 类模板实例化需要在类模板名字后跟 ,然后将实例化的类型放在 中即可,类模板名字不是真正的类,而实例化的结果才是真正的类

    10810

    【C++】格式与实例化操作——详解(7)

    模板参数与模板参数列表 模板参数分类类型形参与非类型形参: 类型形参:出现在模板参数列表中,跟在class(typename)后面的参数类型名称 非类型形参:就是用一个常量作为类(函数)模板的一个参数...1)函数模板概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化, 根据实参类型产生函数的特定类型版本 ; 2)函数模板的格式 ​template void...,int与int,double与double) PS:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class) ; 3)函数模板的实例化 引入:...【模板参数的匹配原则 】 一个非模板函数可以和一个 同名 的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数 对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例...) { // 类内成员定义 }; 2)类模板的实例化 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可 ,类模板名字不是真正的类,而实例化的结果才是真正的类

    12410

    【C++初阶】C++模板编程入门:探索泛型编程的奥秘

    ,称为函数模板的实例化 模板参数实例化分为:隐式实例化和显式实例化 隐式实例化 隐式实例化:让编译器根据实参推演模板参数的实际类型 // 隐式实例化 template T Add...0; } 模板参数列表中只有一个T时,无法将两个类型不同的放在一起推演,编译器无法确定此处到底该将T确定什么类型而报错 显式实例化 显式实例化:在函数名后的中指定模板参数的实际类型 // 显式实例化...Add(a1, d1); return 0; } 注意: 如果类型不匹配,编译器会尝试进行隐式类型转换 如果无法转换成功编译器将会报错 模板参数的匹配原则 模板参数的匹配原则:...Add能够和T Add同时存在,在调用函数时若参数和非模板函数匹配,那么编译器会优先调用非模板函数若非模板函数;不匹配或模板函数更匹配,那么编译器会优先调用模板函数 3....= _capacity = 0; } 关于类模板其实就是将原来实际类型的位置变成T 类模板的实例化 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可

    14910

    C++打怪升级(八)- 泛型编程初见

    ,可以写多个同名参数类型不同的函数来实现; C++函数重载解决了函数同名的问题,但是我们还是要写多个函数,而它们仅仅只有类型不同; void Swap(char& a, char& b) { char...---- 函数模板 概念 函数模板代表了一个函数家族,与具体类型无关,在使用时被参数化,编译器会根据实参类型产生函数的特定类型版本 格式 C++模板引入了新关键字template表示模板; 对于函数模板参数类型并不是具体的类型...,typename Tn> 返回值类型 模板函数名(函数参数列表){ //模板函数体 } 例子 交换函数模板 //函数模板 template void Swap(T& t1, T&...实参与模板参数类型不完全匹配 当遇到实参与模板参数类型不完全匹配时,编译器会报错,因为模板函数不允许自动类型转换; 对于Add()函数模板来说,我们传入两个实参类型不同,而模板函数只有一个通用类型,..._a; } //说模板实参列表要与形参列表匹配 template A& A::operator=(const A& a) { _a = a.

    81620
    领券