c++模板使用、及常见问题 (***)

目录

c++模板使用及常见问题 (***)


C++调用函数模板的规则 (****)

C++ template模板函数的定义与调用 (****)

C++类模板,你看我就够了

C++函数模板的详细讲解【函数模板的概念、用法及其模板函数的概念知识】 (***)

C++ 函数模板的全局特化与局部特化 (***)

================================

c++模板使用及常见问题

  https://www.cnblogs.com/socks/p/11451600.html

一、为什么使用模板??

使用模板的目的是为了避免重复声明和定义一系列基本功能相同的函数或者类,其区别因传入参数的不同而产生不同类型的数据,其基本工作过程都是一致的!

二、调用模板函数产生不明确问题

(1)template declarations are only permitted at global ,namespace ,or class scope

模板声明只允许在全局、命名空间或类范围内使用!故不能在main函数中直接定义。

(2)conld not deduce template argument for T

不明确传递给fun()函数的T类型!

解决方法,可以在调用的时候加以声明。

 (3)对于传入模板的参数不同的问题

模板函数的参数类型定义的是double,调用时确是int和float,实际即为类型转换问题。

 (4)模板继承问题

    如果父类自定义了构造函数,记得子类要使用构造函数列表来初始化
    继承的时候,如果子类不是模板类,则必须指明当前的父类的类型,因为要分配内存空间
    继承的时候,如果子类是模板类,要么指定父类的类型,要么用子类的泛型来指定父类

 (5)友元函数未定义问题

在编译器进行编译的时候,编译器会产生类的模板函数的声明,当时实际确认类型后调用的时候,会根据调用的类型进行再次帮我们生成对应类型的函数声明和定义。我们称之为二次编译。同样,因为这个机制,会经常报错找不到类的函数的实现。在模板类的友元函数外部定义时,也会出现这个错误。解决方法是 “ 进行类的前置声明和函数的前置声明 ”。

(6)声明和定义不在同一个文件的问题

模板的声明是在.h文件,定义是在.cpp文件,因编译时只产生声明的代码,故编译不会出错,但是当调用时会产生找不到类或者函数的问题,

解决方法:

    1、将模板的声明和定义放在同一个文件中

    2、主函数中调用#include<.cpp>或者将.cpp文件改为.hpp文件再引用

C++ template模板函数的定义与调用 (****)

引用《C++primer(第四版)》里的观点:
1)标准C++为编译模板代码定义了两种模型:“包含”模型和“分别编译”模型。
2)所有编译器都支持“包含”模型,某些编译器支持“分别编译”模型。

问题的提出:(帖子在:http://topic.csdn.net/u/20101215/15/f4f270f2-f0f9-4c5f-8765-1bfde2aeebbf.html)

方法一:

声明和实现都放在头文件里。

在类模板头文件 template_compile.h中:

template_compile.h

template<class T>  
class base  
{  
public:  
    base() {};  
    ~base() {};  
    T add_base(T x,T y);  
};  

template<class T>  
T base<T>::add_base(T x,T y)  
{  
    return x+y;  
}

在使用模板的测试文件use_template.cpp中:

use_template.cpp

#include<iostream>  
#include "template_compile.h"  
using namespace std;  
void main()  
{  
    base<int> bobj;  
    cout<<bobj.add_base(2,3)<<endl;  
}  

方法二:

按C++primer中的“包含”模型,定义模板类的头文件中的末行用语句

#include “template_compile.cpp”

在类模板头文件template_compile.h中:

template<class T>  
class base  
{  
public:  
    base() {};  
    ~base() {};  
    T add_base(T x,T y);  
};  
#include "template_compile.cpp"  

在类模板的实现文件template_compile.cpp中:

template<class T>  
T base<T>::add_base(T x,T y)  
{  
    return x+y;  
}

 测试文件不变。

方法三

使用define

在类模板头文件template_compile.h中:

template<class T>  
class base  
{  
public:  
  base() {};  
  ~base() {};  
  T add_base(T x,T y);  
};  
#define TEMP  
#include "template_compile.cpp"  

在类模板的实现文件template_compile.cpp中:

#ifdef TEMP  
template<class T>  
T base<T>::add_base(T x,T y)  
{  
  return x+y;  
}  
#endif  

测试文件不变。

方法四

在类模板头文件template_compile.h中:

template<class T>  
class base  
{  
public:  
    base() {};  
    ~base() {};  
    T add_base(T x,T y);  
};

在类模板的实现文件template_compile.cpp中:

#include "template_compile.h"  
template<class T>  
T base<T>::add_base(T x,T y)  
{  
    return x+y;  
}  

在使用模板的测试文件use_template.cpp中:使用#include “template_compile.cpp”

#include “template_compile.cpp” :这时,该文件设置为 模板专用的 cpp,才是合适的?

#include<iostream>  
#include "template_compile.cpp"  
using namespace std;  
void main()  
{  
    base<int> bobj;  
    cout<<bobj.add_base(2,3)<<endl;  

————————————————
版权声明:本文为CSDN博主「Yetongfff」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/imfengyitong/article/details/54767195

C++函数模板的详细讲解【函数模板的概念、用法及其模板函数的概念知识】 (***)

目录

    前言
    C++函数模板的使用
    函数模板语法
        1.模板说明
        2.函数定义
        3.函数模板调用
    模板函数
    函数模板和函数重载
        嵌套使用函数模板
    函数模板和普通函数在一起,调用规则
    在Linux中反汇编查看函数模板被调用的机制

前言

C++提供了模板(template)编程的概念。

所谓模板,实际上是建立一个通用函数或类,其类内部的类型和函数的形参类型不具体指定,用一个虚拟的类型来代表。这种通用的方式称为模板。

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。

C++函数模板的使用

为什么要有函数模板

例如,在一个项目中,有个项目需求是能够实现多个函数用来返回两个数的最大值,要求能支持char类型、int类型、double类型变量。然后呢,根据这个需求,我们写了以下这个代码。

#include <iostream>

。。。。详细,参见:原文。。。。。。

————————————————
版权声明:本文为CSDN博主「随你而归的云彩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_53636439/article/details/119777817

C++调用函数模板的规则 (****)

规则一:

当函数模板和普通函数一致时,会调用普通函数

#include<iostream>

using namespace std;

   

template<typename T>
T test1(T a, T b) {
    cout << "调用函数模板" << endl;
    return a;
}

  

int test1(int a,int b) {
    cout << "调用普通函数" << endl;
    return a;
}

  

int main() {
    test1(3, 5);
    getchar();
    return 0;
}

在这里插入图片描述

规则二:

可以通过 空模板实参列表的语法 限定使用函数模板

#include<iostream>

using namespace std;

  

template<typename T>
T test1(T a, T b) {
    cout << "调用函数模板" << endl;
    return a;
}

  

int test1(int a,int b) {
    cout << "调用普通函数" << endl;
    return a;
}

  

int main() {
    test1<>(3, 5);
    getchar();
    return 0;
}

在这里插入图片描述

规则三:

如果函数模板可以产生一个更优的匹配就选择函数模板

#include<iostream>

using namespace std;

template<typename T>
T test1(T a, T b) {
    cout << "调用函数模板" << endl;
    return a;
}

int test1(char a,int b) {
    cout << "调用普通函数" << endl;
    return a;
}

int main() {
    test1(3, 5);
    getchar();
    return 0;
}

在这里插入图片描述

规则四:

函数模板也可以进行重载

#include<iostream>

using namespace std;

template<typename T>
T test1(T a, T b) {
    cout << "调用函数模板1" << endl;
    return a;
}

template<typename T>
T test1(T a, T b,T c) {
    cout << "调用函数模板2" << endl;
    return a;
}
//
//int test1(char a,int b) {
//    cout << "调用普通函数" << endl;
//    return a;
//}

int main() {
    test1(3, 5, 9);
    getchar();
    return 0;
}

在这里插入图片描述
————————————————
版权声明:本文为CSDN博主「小生乔克」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Pluto1219/article/details/108108975

C++ 函数模板的全局特化与局部特化 (***)

1.函数模板的全局特化

函数模板的全局特化和类模板的全局特化类似,以template<>开头。

template<>
int f(int)
{
   return 2;
}

另外,函数模板的全局特化不能包含缺省的实参值,而函数模板可以包含缺省的实参值

template<typename T>
int f(T ,T x=42)
{
 return x;
}

template<>
int f(int ,int =42)  //错误,不能包含缺省实参值
{
 return x;
}

2.函数模板的局部特化

函数的局部特化和类模板的局部特化类似。

template<typename T>
int f(T* ,T*)
{
  return 0;
}

————————————————
版权声明:本文为CSDN博主「xqs_123」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35721743/article/details/84668357

C++类模板,你看我就够了

  https://www.jianshu.com/p/70ca94872418

C++中有一个重要特性,那就是模板类型。类似于Objective-C中的泛型。C++通过类模板来实现泛型支持。

1 基础的类模板

类模板,可以定义相同的操作,拥有不同数据类型的成员属性

通常使用template来声明。告诉编译器,碰到T不要报错,表示一种泛型.

如下,声明一个普通的类模板:

template <typename T>
class Complex{
    
public:
    //构造函数
    Complex(T a, T b)
    {
        this->a = a;
        this->b = b;
    }
    
    //运算符重载
    Complex<T> operator+(Complex &c)
    {
        Complex<T> tmp(this->a+c.a, this->b+c.b);
        return tmp;
    }
        
private:
    T a;
    T b;
}

int main()
{
    //对象的定义,必须声明模板类型,因为要分配内容
    Complex<int> a(10,20);  
    Complex<int> b(20,30);
    Complex<int> c = a + b;
    
    return 0;
}


作者:岁与禾
链接:https://www.jianshu.com/p/70ca94872418
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值