前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】泛型编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )

【C++】泛型编程 ⑦ ( 类模板常用用法 | 类模板声明 | 类模板调用 | 类模板作为函数参数 )

作者头像
韩曙亮
发布2024-05-24 08:49:16
410
发布2024-05-24 08:49:16
举报

一、类模板基础用法


1、类模板声明定义

上一篇博客中 , 【C++】泛型编程 ⑥ ( 类模板 | 类模板语法 | 代码示例 ) 讲解了模板类的基础语法 , 模板类声明如下 :

代码语言:javascript
复制
// 声明类模板
template <typename T>
class MyClass {
public:
    T value;
    MyClass(T val) : value(val) {}
    void printValue() {
        std::cout << value << std::endl;
    }
};

2、类模板使用

模板类声明后 ,

代码语言:javascript
复制
// 声明类模板
template <typename T>
class MyClass {
public:
    T value;
    MyClass(T val) : value(val) {}
    void printValue() {
        std::cout << value << std::endl;
    }
};

使用 模板类 创建 实例对象时 ,

首先 , 要进行 具体类型 初始化 , 该操作就是在 模板类 后面的 尖括号中 , 注明 泛型类型 ;

代码语言:javascript
复制
MyClass<int>

此时 , 注明 泛型类型后 , 就会生成 具体的类 ;

然后 , 使用 具体的类 , 定义 具体的 变量 ;

代码语言:javascript
复制
MyClass<int> myInt(10);

3、类模板做函数参数

类模板 作为函数参数 , 形参 必须是具体类型 , 也就是 类模板 的泛型类型必须声注明 ;

下面的 fun 函数中 , 接收模板类作为参数 , 模板类的 泛型类型 需要被注明 ;

代码语言:javascript
复制
// 类模板对象作为函数参数
// 形参必须是具体类型
// 类模板的泛型类型必须声注明
void fun(MyClass<int> &a)
{
    a.printValue();
}

如果不指定 泛型类型 , 会报错 error C2955: “MyClass”: 使用 类 模板 需要 模板 参数列表 错误 ;

代码语言:javascript
复制
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(18,18): error C2955: “MyClass”: 使用 类 模板 需要 模板 参数列表
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(6): message : 参见“MyClass”的声明
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,18): error C2662: “void MyClass<T>::printValue(void)”: 不能将“this”指针从“MyClass”转换为“MyClass<T> &”
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,18): message : 原因如下: 无法从“MyClass”转换为“MyClass<T>”
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(20,5): message : 转换要求第二个用户定义的转换运算符或构造函数
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(10,10): message : 参见“MyClass<T>::printValue”的声明
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(39,15): error C2664: “void fun(MyClass &)”: 无法将参数 1 从“MyClass<int>”转换为“MyClass &”
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Test.cpp(18,6): message : 参见“fun”的声明
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

二、完整代码示例


1、代码示例

下面的示例中是一个 C++ 模板类 MyClass 的定义 ; 这个类可以接受一个类型参数T , 并创建一个具有该类型的成员变量的对象 ;

MyClass是一个模板类 , 该模板类 接受一个 泛型类型参数T , 泛型类型参数 T 在类中的许多地方都会用到 , 在类体中定义了一个 T 类型的成员变量 value , 以及一个接受T类型参数的构造函数 , 在printValue函数中 , 打印 value 的值 ;

template <typename T> 是模板声明 , 告诉编译器我们将在后面定义一个类模板 , 其中T是一个类型参数 ;

在类模板中 , 所有使用T的地方都可以被任何类型替换 ;

MyClass<int> myInt(10); 中的 <int> 是模板参数 , 表示这个类的类型参数是 int ;

myInt(10) 是创建了一个 MyClass<int> 的实例对象 , 并使用 (10) 进行初始化 ;

代码语言:javascript
复制
#include "iostream"
using namespace std;

// 声明类模板
template <typename T>
class MyClass {
public:
    T value;
    MyClass(T val) : value(val) {}
    void printValue() {
        std::cout << value << std::endl;
    }
};

// 类模板对象作为函数参数
// 形参必须是具体类型
// 类模板的泛型类型必须声注明
void fun(MyClass<int> &a)
{
    a.printValue();
}

int main() {

    // 调用类模板 

    MyClass<int> myInt(10);         // 创建一个 int 类型的实例  
    myInt.printValue(); 	        // 输出:10  

    MyClass<double> myDouble(10.0); // 创建一个 double 类型的实例  
    myDouble.printValue(); 		    // 输出:10  

    MyClass<string> myStr("hello"); // 创建一个 string 类型的实例  
    myStr.printValue();             // 输出:hello


    // 类模板作为 函数参数
    MyClass<int> myInt2(88);
    fun(myInt2);

	return 0;
}

2、执行结果

执行结果 :

代码语言:javascript
复制
10
10
hello
88
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、类模板基础用法
    • 1、类模板声明定义
      • 2、类模板使用
        • 3、类模板做函数参数
        • 二、完整代码示例
          • 1、代码示例
            • 2、执行结果
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档