C++ 模板类编译前需要实例化

在复习list容器的模拟实现,遇到了模板未实例化导致代码报错的问题,list的模拟实现可以看下面这篇文章,这里就不多赘述了,直接切入正题。C++list模拟http://t.csdnimg.cn/N6BGh现在的情况是我们已经模拟实现了list类,想在全局写一个Print()函数,并使用模板来操作,方便我们打印任意类型的list,下面是代码。

cpp 复制代码
template<typename T>
void Print(const list<T>& lt)
{
	list<T>::const_iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	for (auto e : lt)
	{
		cout << e << " ";
	}
	cout << endl;
}

代码部分很简单,就是一个迭代器遍历的问题,能保证我写的代码没有错,但是代码就是报错。

使用手动创建一个迭代器是不被允许的,而使用范围for能编译通过(虽然范围for的本质也是迭代器)。

后面我发现是模板还没有实例化的问题,因为list类也是使用模板来处理,因此一开始是不会实例化的。而我们代码中使用了这个还未实例化list类里面的const_iterator,他肯定是找不到这里面的内容的。

因此我们得告诉编译器,你先不要急着去找类对象的实例化,等后面再去找,运行过来的时候,代码就没问题了。

代码也肯简单,在list前面加上typename或者class关键字就可以了,代表这是个模板类,等下运行时再去找。

有了这一层后,我们就可以进行list的打印了

但是我们写的代码仅仅是针对了list容器的打印,我想要一个能够支持所有容器的打印,就还得变形。

我们可以不需要具体类型了,直接将类当成一个整体来处理,用Container来代替list<T>,这样就避免了使用单一容器,任何容器只要有迭代器都可以访问。同时不要忘记加上typename

cpp 复制代码
template<typename Container>
void Print(const Container& lt)
{
	typename Container::const_iterator it = lt.begin();
	while (it != lt.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

只能说泛型编程真的厉害!!!

相关推荐
胡萝卜3.05 小时前
掌握C++ map:高效键值对操作指南
开发语言·数据结构·c++·人工智能·map
电子_咸鱼5 小时前
【STL string 全解析:接口详解、测试实战与模拟实现】
开发语言·c++·vscode·python·算法·leetcode
沐知全栈开发6 小时前
ionic 选项卡栏操作详解
开发语言
曹牧6 小时前
C#中,#region和#endregion
开发语言·c#
顾安r6 小时前
11.22 脚本打包APP 排错指南
linux·服务器·开发语言·前端·flask
蒙小萌19936 小时前
Swift UIKit MVVM + RxSwift Development Rules
开发语言·prompt·swift·rxswift
Z***25807 小时前
Java爬虫框架
java·开发语言·爬虫
hateregiste7 小时前
C语言中如何优雅、准确、高效地设计和处理输入输出
c语言·开发语言·scanf·输入输出
SundayBear7 小时前
C语言复杂类型声明完全解析:从右左原则到工程实践
c语言·开发语言·数据结构·嵌入式
90后小陈老师7 小时前
用户管理系统 05 实现后端注册功能 | Java新手实战 | 最小架构 | 期末实训 | Java+SpringBoot+Vue3
java·开发语言·spring boot·后端·spring·maven·mybatis