【C++初阶】--- 模板进阶
1.非类型模板参数
• 模板参数分类类型形参与非类型形参。
• 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。
• 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。
注意:
- 非类型模板参数必须是整型常量(有符号/无符号:char、short、int、long、long long、bool)
- 浮点数、类对象以及字符串是不允许作为非类型模板参数的。
- 非类型模板参数必须要在编译期才能确认结果。
namespace wsj
{//T是类型模板参数,N是非类型模板参数template<class T,size_t N=10>class array{private://模板中可以将非类型模板参数当作常量使用T _array[N];size_t size;};
}
2.array
• 在 C++ 标准库中,std::array 是一个固定大小的容器,它可以存储一组相同类型的元素。
• array开辟空间的效率比vector要高一些,因为array开的是静态数组,是在栈上开的,而vector开的是动态数组,是在堆上开的,栈上开空间比堆上开空间效率高。
• 普通数组越界读不会检查,越界写会抽查。array越界读和写都可以检查。
老一点的编译器越界写只会检查数组最后一个元素的后两位,这两位的值为-1,如果被修改则说明越界访问了。
3.模板的特化
3.1特化的概念
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,比如:实现了一个专门用来进行小于比较的函数模板。
#include<iostream>
using namespace std;class Date
{
public:Date(int year = 1900, int month = 10, int day = 15):_year(year),_month(month),_day(day){}bool operator<(const Date& d) const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day < d._day);}bool operator>(const Date& d) const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}private:int _year;int _month;int _day;
};template<class T>
bool Less(T left, T right)
{return left < right;
}int main()
{cout << Less(1, 2) << endl;//可以比较,结果正确Date d1(2025, 4, 23);Date d2(2025, 4, 24);cout << Less(d1, d2) << endl;//可以比较,结果正确Date d3(2025, 4, 24);Date d4(2025, 4, 24);Date* p1 = &d3;Date* p2 = &d4;cout << Less(p1, p2) << endl;//可以比较,结果错误return 0;
}
可以看到,Less绝对多数情况下都可以正常比较,但是在特殊场景下就得到错误的结果。上述示例中,p1指向的d3显然等于p2指向的d4对象,但是Less内部并没有比较p1和p2指向的对象内容,而比较的是p1和p2指针的地址,这就无法达到预期而错误。
此时,就需要对模板进行特化。即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化。
3.2函数模板特化
函数模板的特化步骤:
- 必须现有一个基础的函数模板
- 关键字template后面接一对空的尖括号<>
- 函数名后面跟一对尖括号,尖括号中指定需要特化的类型
- 函数形参表:必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错位。
上方代码的特化结果如下:
//原模版
template<class T>
bool Less(const T& left, const T& right)
{return left < right;
}//函数模板特化
//const在*右边修饰的是本身,在左边修饰的是指向内容
template<>
bool Less<Date*>(Date * const& left, Date * const& right)
{return *left < *right;
}
注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出。
bool Less(Date* left, Date* right)
{return *left < *right;
}
该种实现简单明了,代码的可读性高,容易书写,因为对于一些参数类型复杂的函数模板,特化时特别给出,因此函数模板不建议特化。
3.3类模板特化
3.3.1全特化
全特化即将模板参数列表中的所有的参数都确定化
#include<iostream>
using namespace std;template<class T1,class T2>
class Date
{
public:Date(){cout << "Date<T1,T2>" << endl;}private:T1 _d1;T2 _d2;
};//全特化
template<>
class Date<int, char>
{
public:Date(){cout << "Date<int,char>" << endl;}private:int _d1;char _d2;
};int main()
{Date<int, int> d1;//调的模板Date<int, char> d2;//调的特化return 0;
}
3.3.2偏特化/半特化
偏特化:任何对模板参数进一步进行条件限制涉及的特化版本。比如对于以下类模板:
emplate<class T1,class T2>
class Date
{
public:Date(){cout << "Date<T1,T2>" << endl;}private:T1 _d1;T2 _d2;
};
偏特化有以下两种表示方式:
- 部分特化:将类模板参数列表中的一部分参数特化。
//将第二个参数特化为int
template<class T1>
class Date<T1, int>
{
public:Date(){cout << "Date<T1,int>" << endl;}
private:T1 _d1;int _d2;
};
- 偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本。
注意:虽然传的是引用和指针,但T1和T2依旧是原类型,比如传的是int&和char*,则T1是int,T2是char
//两个参数偏特化为引用和指针
template<class T1, class T2>
class Date<T1&, T2*>
{
public:Date(){cout << "Date<T1&,T2*>" << endl;}
private:T1* d1;T2* d2;
};
4.模板分离编译
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。
4.1模板的分离编译
模板不支持声明和定义分离,假如有以下场景,模板的声明与定义分离开,在头文件中进行声明,源文件中完成定义:
// Func.h声明
//模板函数
template<class T>
T Add(const T& left, const T& right);
//普通函数
void func(const int& left, const int& right);// Func.cpp定义
template<class T>
T Add(const T& left, const T& right)
{cout << "T Add(const T& left, const T& right)" << endl;return left + right;
}void func(const int& left, const int& right)
{cout << "void func(const int& left, const int& right)" << endl;
}// test.cpp
#include"a.h"
int main()
{Add(1, 2);func(1, 2);return 0;
}
C/C++程序要运行,一般要经历以下步骤:
预处理—>编译—>汇编—>链接
-
预处理:头文件展开/宏替换/条件编译/去掉注释…,生成.i文件
-
编译:检查语法,生成汇编代码,生成.s文件
-
汇编:汇编代码转换成二进制机器码,生成.o文件(目标文件)
.o文件中包含符号表,符号表记录每个文件中定义和引用的符号(像函数名、变量名等),假如文件A中的函数调用了文件B里定义的函数,编译器就会通过符号表找到文件B中该函数的定义地址,然后文件A中的函数调用指向这个地址。
-
链接:将目标文件合并在一起是生成可执行程序,并且把需要的函数地址等链接上,生成.exe文件
所以上述代码中,Func.cpp中的func函数会进入符号表,而模板函数Add还没有生成具体的函数,所以不会进入符号表。
而test.cpp文件中包含声明的头文件,所以能编译过,但调用模板函数的时候会报错,因为在符号表中找不到其地址
为什么编译器允许有声明就能过,举个例子,就好比买房子,我们有了声明就相当于交了定金,交了定金这套房暂时就不会卖给别人,但这套房要给你的话你还需要一周后交定金,而这个定金在符号表中,而我们符号表中没有我们需要的函数地址,因此我们交不出定金,那这套房依旧不是我们的,因此链接报错
4.2解决方法
- 将声明和定义放到一个文件 “xxx.hpp” 里面或者xxx.h其实也是可以的。推荐使用这种。因为定义在头文件当中,我们包了头文件就相当于包含了模板的声明和定义,那程序编译的时候就可以将模板实例化成对应的函数。
- 模板定义的位置显式实例化。这种方法不实用,不推荐使用。
//显示实例化
template
int Add(const int& left, const int& right);
相关文章:
【C++初阶】--- 模板进阶
1.非类型模板参数 • 模板参数分类类型形参与非类型形参。 • 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 • 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参…...
数据库所有知识
# 第一章 数据库-理论基础 ## 1.1 什么是数据库 数据: 描述事物的符号记录, 可以是数字、 文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机。 数据库: 存储数据的仓库,…...
docker部署的Nextcloud,处于维护模式,如何解决
Nextcloud 在升级后卡在维护模式,以下是针对 Docker 部署的解决方案: 1. 通过 OCC 命令强制关闭维护模式 进入 Nextcloud 容器内部执行命令: # 替换 nextcloud 为你的容器名称 docker exec -it --user www-data nextcloud php occ maintena…...
mongoose插入文档,字段类型, 字段验证, 删除文档,更新文档,读取文档,查询文档的条件控制 ,字段筛选,数据排序,数据截取
、Mongoose 中与 文档操作(插入、查询、更新、删除)及其相关功能(字段类型、验证、条件筛选、排序、分页等)相关示例: 📋 一、字段类型定义(Schema Types) const mongoose require…...
源码编译安装LAMP
一:LAMP概述 LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP…...
C++每日训练 Day 18:构建响应式表单与数据验证(初学者友好)
📘 本篇目标:在前几日协程与事件驱动机制基础上,构建一个响应式表单系统,实现用户输入的异步验证与反馈。通过协程挂起/恢复机制,简化异步逻辑,提升代码可读性。 🔁 回顾 Day 17:响应…...
Linux环境变量以及进程虚拟地址原理
目录 一、介绍进程优先级 1.什么是优先级 2.为什么会有优先级 3.Linux中的优先级是怎么确定的 1)查看Linux中的优先级 2)计算优先级和更改优先级 二、环境变量 1.什么是环境变量 2.环境变量有什么作用 3.环境变量怎么做到的 1)查看系统已有的…...
基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案
基于非递归求解的汉诺塔超级计算机堆栈与数据区设计方案 一、设计背景与目标 汉诺塔问题存在非递归直接求解方法,相较于递归法具有明确移动规律和潜在性能优势。本设计旨在利用非递归求解规律,优化汉诺塔超级计算机的堆栈与数据区结构,降低…...
【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso)
【Linux应用】在PC的Linux环境下通过chroot运行ARM虚拟机镜像img文件(需要依赖qemu-aarch64、不需要重新安装iso) qemu提供了运行ARM虚拟机的方法 具体的操作方式就是建立一个硬盘img 然后通过iso安装到img 最后再运行img即可 这种方式教程很多 很简单 …...
CISC与RISC详解:定义、区别及典型处理器
一、CISC(复杂指令集计算机) Complex Instruction Set Computer 核心思想:通过设计复杂的指令,减少程序指令数量,以硬件复杂度换取编程便利性。 主要特点: 指令复杂度高: 单条指令可完成多步操…...
数据库中DDL、DML、DCL的区别是什么?
数据库中DDL、DML、DCL的区别是什么? 在数据库的使用过程中,SQL(结构化查询语言)常常被用来执行不同的操作,主要分为三类:DDL(数据定义语言)、DML(数据操纵语言…...
【东枫电子】AI-RAN:人工智能 - 无线接入网络
太原市东枫电子科技有限公司,翻译 文章目录 1.概述1.1 什么是AI-RAN?1.2 为什么是AI-RAN?1.3 AI-RAN有哪些好处?1.4 为什么 AI-RAN 会给通信服务提供商 (CoSP) 带来变革?1.5 AIRAN 的构建模块是什么? 2. 参…...
实习技能记录【5】-----项目中消息传递到ui层的方法
代码 while (1){osEvent evt;evt osMailGet(ui_msg_mailbox, 0);if (evt.status osEventMail){UI_MSG_APP_T *msg (UI_MSG_APP_T *)evt.value.p;if (msg->cmd_type CMD_TYPE_INNER){if (msg->cmd_code CMD_CODE_INNER_REFRESH_NOW){lv_obj_invalidate(lv_scr_act()…...
4.29【Q】paraCompute
还是同样的要求,我要写实验报告,如何组织描述运行时间,加速比,效率等随数据规模,进程数,线程数变化的语言和逻辑,从而显得不冗余和精简?为我生成合理排版,布局的文字&…...
什么是布林带?
什么是布林带? 布林带是约翰布林格在20世纪80年代开发的一种广泛使用的技术分析工具。布林带由价格图表上的三条线组成:中轨、上轨和下轨。中轨通常是20天简单移动平均线(SMA),代表资产在此期间的平均价格。上轨和下轨…...
爬虫学习笔记(四)---request入门
例1 例1:写一个爬取百度搜索页面的程序,以搜索一个喜欢的明星为例(如在搜索框中输入周杰伦) 正常搜索 页面 爬虫思路: 1.用一个query变量,在控制台输入的方式更加灵活的输入想爬取的明星的百度搜索页面 …...
JSON配置文件格式全解析与多语言实战指南
JSON配置文件格式全解析与多语言实战指南 摘要 本文全面解析JSON配置文件的核心语法规范,深入探讨数据类型、转义机制及JSON5扩展特性,提供JavaScript/Python/Java等多语言解析方案。通过典型应用场景案例演示JSON的最佳实践,帮助开发者高效…...
JavaScript 中的类型转换机制?
一、类型转换的两种模式 1. 显式转换(手动翻译) 你主动告诉 JavaScript 如何转换类型,比如: let num Number("123"); // 字符串 → 数字:123 let str String(123); // 数字 → 字符串:&qu…...
【分享】音频音乐剪辑[特殊字符]人声分离伴奏提取[特殊字符]拼接合并
音频音乐剪辑是一款专业的剪辑软件。在剪辑过程中,它可以对音频进行拼接合成、音乐裁剪、变调变速、格式转换,同时音频音乐剪辑还是一款支持高清录音、音频降噪等众多功能于一体的音频制作软件。 【应用名称】:音频剪辑 【应用版本】…...
关于 const a 定义的数据 与 其渲染 的问题。即通过const定义的常量,会不会导致渲染不及时。
情况1 (同2、4结论一致) 定义:使用子hook,将数据 const a 【对stateX的一系列操作】 封存到子hook里。并return出去。结果:此种情况不影响实时渲染。缺点:只要stateX变更,一定展示c的最新数据…...
开源Kotlin从零单排0基础完美入门教程
🚀 Kotlin 从零单排 一个让你欲罢不能的 Kotlin 入门教程! 教程仓库地址 👋 Hey,你好啊! 如果你: 🤔 听说 Kotlin 很香,但不知道香在哪?😅 Java 写得头大&a…...
主流微前端框架比较
主流微前端框架比较 以下表格列出了当前主流微前端框架的核心对比信息,包括基本介绍、核心特性、适用场景、技术栈兼容性、优缺点、社区维护情况和典型应用案例等: 框架基本介绍核心特性与机制适用场景技术栈兼容性优缺点社区维护情况典型应用案例qiankun蚂蚁金服推出的生产…...
DOM 事件的处理通常分为三个阶段:捕获、目标、冒泡【前端示例】
如果神明还不帮你,说明他相信你。 目录 引言:捕获阶段:目标阶段:冒泡阶段:事件传播示意图:示例:代码:解读:输出: 引言: DOM 事件的处理通常分为三…...
C#实现对达索(Dassault)SolidWorks中3D图纸转化为手机可直接查看预览图纸格式
转化环境无需安装SolidWorks。 代码更新:暂不公开。 实现效果:...
Twitter 工作原理|架构解析|社交APP逻辑
这是对Twitter 工作原理|架构解析|社交APP逻辑_哔哩哔哩_bilibili的学习,感谢up小凡生一 在两年半前,埃隆马斯克收购了Twitter,并且进行了一系列重大改革。今天我们来解析一下这个全球知名社交平台的架构。首先&#x…...
模拟集成电路设计与仿真 : Feedback System
前情提要 此為作者針對迴授系統,進行資料統整,以便日後查詢 原理 1. The Whole System 更正 : V - V feedback 是 並 - 串 迴授 2. Feedback Block Beta 更正 : ,所以 the whole systemfeedback block左 2右 1 feedback block feed…...
Linux权限管理进阶:文件归属、特殊权限与ACL详解
一、文件归属管理:chown命令 1. 基础语法与作用 chown 命令用于修改文件或目录的 属主(Owner) 和 属组(Group),是Linux权限管理中调整资源归属的核心工具。 chown [选项] 新属主:新属组 文件/目录 常用…...
MyBatis、MyBatis-Plus、Hibernate、Spring Data JPA 等 Java 持久层技术的理解和对比
一、基本概念 1. MyBatis 是一个 半自动的 ORM 框架(Object-Relational Mapping),用于简化 JDBC 开发。它允许你通过 XML 或注解配置 SQL 语句,将 Java 对象与 SQL 查询结果进行映射。 2. MyBatis-Plus(MPÿ…...
如何用vivado导出pin delay
目录 简介: Vivado工具导出pin delay步骤: 简介: 通过在一些等长要求比较严格的场合,会考虑到FPGA内部的走线,这时候就需要用到方法去导出fpga的pin delay。本文以xinlinx 的UltraScale系列的XCKU060-2FFVA1156I为例…...
【图片识别改名】批量读取图片区域文字识别后批量改名,基于Python和腾讯云的实现方案
项目场景 办公文档管理:将扫描的发票、合同等文档按编号、日期自动重命名。例如,识别“编号:2023001 日期:20230403”生成“2023001_20230403.jpg”。产品图片整理:电商产品图片按产品编号、名称自动命名。例如,…...
数字中国浪潮下:Coremail AI赋能邮件办公,筑牢安全防线引领转型
4月28日,在第八届数字中国建设峰会新产品新技术发布会上,Coremail分享了AI在邮件产品领域的最新应用成果和实践经验。 作为互联网之后的又一波技术浪潮,人工智能(AI)已成为推动各行业变革的核心力量,为企业…...
软件设计师-软考知识复习(1)
写在前面 复习软考,把一些忘记了的知识整理一下,方便后续查看。 设码长为8,补码为11111111,其真值是多少( ) A.1 B.-1 C.127 D.128 参考答案:B 解题步骤 1. 理解补码表示法 在计算机中&…...
快速安装Arduino IED的STM32 MCU开发包
从github安装STM32 MCU开发包非常慢,很难安装成功。因此我将Arduino IED的TM32 MCU开发包上传到国内网站,亲测安装成功。 1.打开Arduino IED,文件--首选项--其它开发板管理地址,添加http://www.aluoyun.cn/BoardManagerFiles-mai…...
Html 2
一,表单 1.概念:在一个区域中,拥有许多输入和最终组件,可以让用户输入、选择信息,最终将信息传入服务器端 2.常用组件: (1)<form action " " methon "get&qu…...
业务层在事务中高频创建动态表然后删除或者回滚导致 pg_dump 概率出现备份失败问题分析
文章目录 测试环境,业务层在事务中高频创建动态表然后删除或者回滚导致 pg_dump 概率出现备份失败职责划分应用层对 DDL 事务的滥用 导致的目录污染怎么理解?应用层在事务中大量高频新建动态表, 然后删除表, 有啥隐患目录版本风暴…...
图漾官网Sample_V1版本C++语言完整参考例子---单相机版本
文章目录 1.参考例子 主要梳理了图漾官网Sample_V1版本的例子 1.参考例子 主要增加了从storage区域读取相机参数的设置,使用图漾PercipioViewer软件,如何将相机参数保存到srorage区,可参考链接:保存相机参数操作 保存参数设置 注…...
SSM书籍管理(业务编写)
查询书籍功能 编写Controller类 Controller RequestMapping("/book") public class BookController {//controller调用service层AutowiredQualifier("BookServiceImpl")private BookService bookService;//查询全部的书籍,并且返回到书籍展示…...
kafka消息的顺序性如何保持一致的
目录 背景: 原理: 情况一:如果只有一个分区 情况二:如果有多个分区 总结 背景: 最近面试总是被问这个问题,然后总感觉答得不好就写博客总结一下,可以先看总结 原理: Kafka 中&#…...
在Java中基于Geotools对PostGIS数据库的空间查询实践
目录 前言 一、相关技术背景介绍 1、评价对象AOI 2、数据处理流程 二、对AOI空间范围查询实践 1、空间查询构建 2、空间样式创建 3、成果出图 三、总结 前言 在当今数字化浪潮下,空间数据的应用价值日益凸显,从城市规划到环境监测,从…...
生活需要一些思考
总分总 写文章、做事情、写邮件、写信,都是要【总分总】。 先总【因为没人有耐心一上来就看细节,先总结,别人感兴趣才会看分】 然后分【分中包括多个子部分,或子章节、子目标,他们之间层层递进,最终引出最…...
Scrapy框架之CrawlSpider爬虫 实战 详解
CrawlSpider 是 Scrapy 框架中一个非常实用的爬虫基类,它继承自 Spider 类,主要用于实现基于规则的网页爬取。相较于普通的 Spider 类,CrawlSpider 可以根据预定义的规则自动跟进页面中的链接,从而实现更高效、更灵活的爬取。 Scr…...
DeepSeek主动学习系统:低质量数据炼金术的工程化实践
文章目录 一、技术体系架构升级1.1 四层协同系统架构1.2 关键技术组件解析(1) 跨模态特征对齐引擎(2) 动态采样策略库 二、低质量数据治理全流程2.1 数据清洗与增强流水线2.2 主动学习迭代流程 三、工业级部署方案3.1 分布式计算架构3.2 动态环境应对策略(1) 概念漂移检测(2) 持…...
学习记录:DAY20
技术探索之旅:YAML配置,依赖注入、控制反转与Java注解 前言 最近有点懒了,太松懈可不行。为了让自己保持学习的动力,我决定将最近的学习内容整理成博客,目标是让未来的自己也能轻松理解。我会尽量以整体记录的方式呈…...
[AI]browser-use + web-ui 大模型实现自动操作浏览器
[AI]browser-use web-ui 大模型实现自动操作浏览器 介绍 官方地址:https://github.com/browser-use/web-ui browser-use主要作用是将 AI Agent 与浏览器链接起来从而实现由 AI 驱动的浏览器自动化。今天会给大家介绍如何通过browser-use web-ui来搭建并操作browse…...
使用LangChain连接远程Oracle数据库尝试LLM 提供的SQL智能助理
使用LangChain连接远程Oracle数据库尝试LLM 提供的SQL智能助理 为完成此次数据库连接实验,笔者用自己的笔记本电脑搭建了一台linux虚机,安装了oracle 23C,并借助deepseek创建了若干与电商业务有关的表并插入了一些记录。 接着在windows实体…...
训练神经网络的批量标准化(使用 PyTorch)
构建神经网络是一门艺术,而非一个结果固定的过程。你无法预知最终能否得到有效的模型,而且有很多因素可能导致你的机器学习项目失败。 然而,随着时间的推移,您还将学会一套特定的笔触,这将大大提高您成功的几率。 在…...
阿里Qwen3 8款模型全面开源,免费商用,成本仅为 DeepSeek-R1 的三分之一
想要掌握如何将大模型的力量发挥到极致吗?叶梓老师带您深入了解 Llama Factory —— 一款革命性的大模型微调工具(限时免费)。 1小时实战课程,您将学习到如何轻松上手并有效利用 Llama Factory 来微调您的模型,以发挥其…...
Vue常用的修饰符有哪些有什么应用场景(含deep seek讲解)
Vue.js 事件修饰符的功能与具体应用场景 一、事件修饰符 .stop .stop 的主要作用是 阻止事件冒泡,防止事件从子元素传播到父元素。这在处理嵌套组件或多层 DOM 结构时非常有用。 <div click"parentClick">Parent<button click.stop"chi…...
案例分享|20倍提效!水力设备电磁仿真的云端实战
在现代水力设备制造领域,电磁仿真是贯穿设计、研发到故障诊断的核心技术之一。而随着"双碳"目标驱动下清洁能源设备的迭代加速,水轮机、水泵等设备研发的多物理场耦合特性对仿真精度提出前所未有的挑战。传统仿真工具在处理复杂多物理场耦合等…...
ShenNiusModularity项目源码学习(25:ShenNius.Admin.Mvc项目分析-10)
本文学习并分析ShenNiusModularity项目中的留言管理页面、回收站页面。 1、留言管理页面 留言管理页面用于检索、删除系统中的留言数据,该页面对应的文件Index.cshtml位于ShenNius.Admin.Mvc项目的Areas\Cms\Views\Message内。页面使用的控制器类MessageController…...