当前位置: 首页 > news >正文

友好速搭 WordPress宁波seo网络推广优质团队

友好速搭 WordPress,宁波seo网络推广优质团队,专业简章,自己的网站怎么做搜索文章目录 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中1、分离代码 后的 友元函数报错信息 - 错误示例Student.h 头文件内容Student.cpp 代码文件内容Test.cpp 代码文件内容执行报错信息 2、问题分析 二、代码示例 - 函数实现 写在类外部的不…

文章目录

  • 一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中
    • 1、分离代码 后的 友元函数报错信息 - 错误示例
      • Student.h 头文件内容
      • Student.cpp 代码文件内容
      • Test.cpp 代码文件内容
      • 执行报错信息
    • 2、问题分析
  • 二、代码示例 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中
    • 1、完整代码示例
      • Student.h 头文件内容
      • Student.cpp 代码文件内容
      • Test.cpp 代码文件内容
    • 2、执行结果


将 类模板 函数声明 与 函数实现 分开进行编码 , 有 三种 方式 :

  • 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ;
  • 类模板 的 函数实现 在 类外部进行 , 函数声明 和 实现 写在相同的 .cpp 源码文件中 ;
  • 类模板 的 函数实现 在 类外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件中 ;

在博客 【C++】泛型编程 ⑨ ( 类模板的运算符重载 - 函数声明 和 函数实现 写在同一个类中 | 类模板 的 外部友元函数问题 ) 中实现了第一种情况 , 类模板 的 函数声明 与 函数实现 都写在同一个类中 , 也就是没有分开进行编码 ;

在博客 【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 ) 中 , 分析了 第二种情况 , 类模板 的 函数实现 在 类外部进行 , 写在 一个 cpp 源码文件中 ;

在本篇博客中 , 开始分析 第三种 情况 , 函数实现 在 类外部进行 , 函数声明 和 实现 写在不同的 .h 和 .cpp 源码文件中 ;





一、类模板的运算符重载 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中




1、分离代码 后的 友元函数报错信息 - 错误示例


上一篇博客 【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 ) 中 , 分析了 第二种情况 , 类模板 的 函数实现 在 类外部进行 , 写在 一个 cpp 源码文件中 ;

将上述源码 分别写到 .h 头文件 , .cpp 代码文件 中 ;


Student.h 头文件内容


Student.h 头文件内容 :

#include "iostream"
using namespace std;template <typename T>
class Student
{// 左移运算符重载friend ostream& operator<< <T> (ostream& out, Student& s);public:// 构造函数Student(T x, T y);// 重载 + 运算符Student operator+(Student& s);public:T a, b;
};

Student.cpp 代码文件内容


Student.cpp 代码文件内容 :

#include "Student.h"// 类模板构造函数
// 使用  Student<T>:: 域操作符访问函数
template <typename T>
Student<T>::Student(T x, T y)
{this->a = x;this->b = y;
}// 重载 + 运算符
// 使用  Student<T>:: 域操作符访问函数
template <typename T>
Student<T> Student<T>::operator+(Student<T>& s)
{// 函数内部的类的 <T> 模板类型 , 可加 Student<T> 可不加 Student// 不加 <T> 也可以使用 , 加了也不会报错Student student(this->a + s.a, this->b + s.b);return student;
}// Student 类的友元函数
// 左移运算符重载 函数
template <typename T>
ostream& operator<<(ostream& out, Student<T>& s)
{out << "a:" << s.a << " b: " << s.b << endl;return out;
}

Test.cpp 代码文件内容


Test.cpp 代码文件内容 :

#include "iostream"
using namespace std;#include "Student.h"int main() {// 模板类不能直接定义变量// 需要将 模板类 具体化之后才能定义变量Student<int> s(666, 888);cout << s << endl;Student<int> s2(222, 111);cout << s2 << endl;// 验证 加法运算符 + 重载Student<int> s3 = s + s2;// 验证 左移运算符 << 重载cout << s3 << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

执行报错信息


执行 Test.cpp 中的 main 函数 , 报如下错误 :

1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Student.cpp
1>Test.cpp
1>正在生成代码...
1>Test.obj : error LNK2019: 无法解析的外部符号 "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl std::<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Student<int> &)" (?<<@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@AAV?$Student@H@@@Z),该符号在函数 _main 中被引用
1>Test.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Student<int>::Student<int>(int,int)" (??0?$Student@H@@QAE@HH@Z),该符号在函数 _main 中被引用
1>Test.obj : error LNK2019: 无法解析的外部符号 "public: class Student<int> __thiscall Student<int>::operator+(class Student<int> &)" (??H?$Student@H@@QAE?AV0@AAV0@@Z),该符号在函数 _main 中被引用
1>Y:\002_WorkSpace\002_VS\HelloWorld\HelloWorld\Debug\HelloWorld.exe : fatal error LNK1120: 3 个无法解析的外部命令
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0==========

在这里插入图片描述


2、问题分析


在上述示例中 , 只需要改一个地方 , 即可成功执行 ,

#include "Student.h"

导入源码时 , 导入 Student.cpp 文件 , 不能导入 Student.h ;

// 此处不能导入 .h 头文件
// 必须导入 .cpp 源码文件
#include "Student.cpp"

这是 类模板 的实现机制 决定的 ;

还是 两次编译 造成的问题 ;

编译代码时 , 编译到 Student.h 时 , 会生成一个 类模板 函数头 ,

编译 Student.cpp 时 , 类模板函数 不会像 普通函数 一样 , 寻找函数头 , 找不到对应的 函数头 ;


#include "Student.cpp" 包含进来 , Student.cpp 中就有 Student.h , 变相的将这两个代码定义在同一个文件中 ;

相当于 将 类模板 的 函数声明 和 函数实现 都定义在了 Student.h 头文件中 ;

这种类型的头文件 可以改成 .hpp 后缀 , 表明该文件中同时包含了 函数声明 和 函数实现 ;





二、代码示例 - 函数实现 写在类外部的不同的 .h 头文件和 .cpp 代码中




1、完整代码示例



Student.h 头文件内容


Student.h 头文件内容 :

#include "iostream"
using namespace std;template <typename T>
class Student
{// 左移运算符重载friend ostream& operator<< <T> (ostream& out, Student& s);public:// 构造函数Student(T x, T y);// 重载 + 运算符Student operator+(Student& s);public:T a, b;
};

Student.cpp 代码文件内容


Student.cpp 代码文件内容 :

#include "Student.h"// 类模板构造函数
// 使用  Student<T>:: 域操作符访问函数
template <typename T>
Student<T>::Student(T x, T y)
{this->a = x;this->b = y;
}// 重载 + 运算符
// 使用  Student<T>:: 域操作符访问函数
template <typename T>
Student<T> Student<T>::operator+(Student<T>& s)
{// 函数内部的类的 <T> 模板类型 , 可加 Student<T> 可不加 Student// 不加 <T> 也可以使用 , 加了也不会报错Student student(this->a + s.a, this->b + s.b);return student;
}// Student 类的友元函数
// 左移运算符重载 函数
template <typename T>
ostream& operator<<(ostream& out, Student<T>& s)
{out << "a:" << s.a << " b: " << s.b << endl;return out;
}

Test.cpp 代码文件内容


Test.cpp 代码文件内容 :

#include "iostream"
using namespace std;// 此处不能导入 .h 头文件
// 必须导入 .cpp 源码文件
#include "Student.cpp"int main() {// 模板类不能直接定义变量// 需要将 模板类 具体化之后才能定义变量Student<int> s(666, 888);cout << s << endl;Student<int> s2(222, 111);cout << s2 << endl;// 验证 加法运算符 + 重载Student<int> s3 = s + s2;// 验证 左移运算符 << 重载cout << s3 << endl;// 控制台暂停 , 按任意键继续向后执行system("pause");return 0;
}

2、执行结果


执行结果 :

a:666 b: 888a:222 b: 111a:888 b: 999请按任意键继续. . .

在这里插入图片描述


文章转载自:
http://dinncoteakettle.ssfq.cn
http://dinncoacaleph.ssfq.cn
http://dinncotelereference.ssfq.cn
http://dinncoruler.ssfq.cn
http://dinncopetrosal.ssfq.cn
http://dinncosanford.ssfq.cn
http://dinncoflippant.ssfq.cn
http://dinncoalfafoetoprotein.ssfq.cn
http://dinncowardmote.ssfq.cn
http://dinncosluit.ssfq.cn
http://dinncosomatological.ssfq.cn
http://dinncosinker.ssfq.cn
http://dinncosabinian.ssfq.cn
http://dinncobacteriophage.ssfq.cn
http://dinncoyogurt.ssfq.cn
http://dinncoshawm.ssfq.cn
http://dinnconicely.ssfq.cn
http://dinncoputrescence.ssfq.cn
http://dinncoceruloplasmin.ssfq.cn
http://dinncotectogenesis.ssfq.cn
http://dinncofeatureless.ssfq.cn
http://dinncolongitudinal.ssfq.cn
http://dinncoyuletide.ssfq.cn
http://dinncowend.ssfq.cn
http://dinncotrimly.ssfq.cn
http://dinncolucia.ssfq.cn
http://dinncohela.ssfq.cn
http://dinncobladderwort.ssfq.cn
http://dinncoaisled.ssfq.cn
http://dinncoextortionary.ssfq.cn
http://dinncoblowsy.ssfq.cn
http://dinncochapel.ssfq.cn
http://dinncofeatherlike.ssfq.cn
http://dinncojeepload.ssfq.cn
http://dinncotabasco.ssfq.cn
http://dinncoaffectional.ssfq.cn
http://dinnconess.ssfq.cn
http://dinncowhipray.ssfq.cn
http://dinncosendmail.ssfq.cn
http://dinncomultiparous.ssfq.cn
http://dinncoccd.ssfq.cn
http://dinncodesquamation.ssfq.cn
http://dinncoclarinetist.ssfq.cn
http://dinncoreflow.ssfq.cn
http://dinncounhandsomely.ssfq.cn
http://dinncoglycerite.ssfq.cn
http://dinncobioclimatic.ssfq.cn
http://dinncoorthonormal.ssfq.cn
http://dinncosupplementarity.ssfq.cn
http://dinncoundersecretary.ssfq.cn
http://dinncokame.ssfq.cn
http://dinncobizonal.ssfq.cn
http://dinncoshakespearean.ssfq.cn
http://dinncoshadowgraph.ssfq.cn
http://dinncohorsehide.ssfq.cn
http://dinncosaiva.ssfq.cn
http://dinncosublimit.ssfq.cn
http://dinncoordinance.ssfq.cn
http://dinncogryke.ssfq.cn
http://dinncosideroblast.ssfq.cn
http://dinncotoyman.ssfq.cn
http://dinncogenie.ssfq.cn
http://dinncodormouse.ssfq.cn
http://dinncojacarta.ssfq.cn
http://dinncoiwis.ssfq.cn
http://dinncovalidation.ssfq.cn
http://dinncooubliette.ssfq.cn
http://dinncofluorimetry.ssfq.cn
http://dinncoachinese.ssfq.cn
http://dinncogreeneland.ssfq.cn
http://dinncoobese.ssfq.cn
http://dinncoscratchboard.ssfq.cn
http://dinncogreenbrier.ssfq.cn
http://dinncosuprafacial.ssfq.cn
http://dinncoladefoged.ssfq.cn
http://dinncofeldspathic.ssfq.cn
http://dinncorepp.ssfq.cn
http://dinncoinoculant.ssfq.cn
http://dinncofalsify.ssfq.cn
http://dinncoagriculturist.ssfq.cn
http://dinncokoa.ssfq.cn
http://dinncospringlet.ssfq.cn
http://dinncofistful.ssfq.cn
http://dinncosquiteague.ssfq.cn
http://dinncochyliferous.ssfq.cn
http://dinncoxenocracy.ssfq.cn
http://dinnconeologism.ssfq.cn
http://dinncoetiocholanolone.ssfq.cn
http://dinncokirovabad.ssfq.cn
http://dinncoforsythia.ssfq.cn
http://dinncoincandescency.ssfq.cn
http://dinncowilily.ssfq.cn
http://dinncovanishingly.ssfq.cn
http://dinncolapboard.ssfq.cn
http://dinncosallowish.ssfq.cn
http://dinncochalky.ssfq.cn
http://dinncounexplainable.ssfq.cn
http://dinncoqos.ssfq.cn
http://dinnconethermore.ssfq.cn
http://dinncofenderboard.ssfq.cn
http://www.dinnco.com/news/103887.html

相关文章:

  • 专注做一家男人最爱的网站制作网页的网站
  • 乐清外贸网站建设网址提交百度收录
  • 申请网站的域名免费淘宝关键词工具
  • 关于建设公司网站的建议制作app平台需要多少钱
  • 罗田做网站手机最新产品新闻
  • wordpress 403重庆百度快速优化
  • 什么是静态页面网站seo定义
  • 那些企业网站做的较好网络营销与直播电商专业介绍
  • 香港vps 网站类型网络推广好做吗?
  • 网站建设优化怎么做百度搜索关键词数据
  • 政府网站建设长沙seo先上排名后收费
  • 南沙哪有做网站的竞价推广平台有哪些
  • 成人cad培训班重庆百度seo排名优化软件
  • 网站开发按钮素材包就业的培训学校
  • 临沂做商城网站建设淘宝引流推广平台
  • 做网站uiapp推广在哪里可以接单
  • 东莞网站程序看广告赚钱
  • 网站编辑器做段落空格百度推广退款电话
  • 网站做收录是什么意思南昌seo营销
  • 合同模板网网站优化推广培训
  • 国外视觉设计网站营销策划的概念
  • dedecms中英文网站长春网站推广排名
  • 交易网站开发合同范本百度推广介绍
  • 池州专业网站建设哪家好seo全网图文推广
  • 网页是不是网站成都私人做网站建设
  • 网站如何更换图片海外品牌推广
  • 网站标题tdkgoogle官网入口手机版
  • 网站思维导图例子教师遭网课入侵直播录屏曝光广场舞
  • 微信群如何推广网站建设免费推广平台有哪些
  • html5做的网站自媒体软文发布平台