LNK2019:无法解析的外部符号 “class std::basic_ostream ...(template 的声明)

一、问题:

今天在实现 vector 时,发现出现了一个错误:

在这里插入图片描述
它说,不认识 ostream,我在重载<< 符号时,使用了 ostream,而且头文件 <ostream> 也包含了,std 的作用域限定符也写了,它怎么会不认识 ostream 呢,也不是不认识,编译的时候是认识的,但链接的时候出错了,真是奇怪了???

下面是代码:

#pragma once

#include<iostream>
#include<ostream>
#include<cstdlib>

namespace zzz
{
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;
		
		friend std::ostream& operator <<(std::ostream& out, const vector<T>& v);
		
		...
		...  //中间是实现的各个成员函数 
		
	private:
		iterator _begin = nullptr;
		iterator _finish = nullptr;
		iterator _endofstorage = nullptr;
	};
	template <class T>
	std::ostream& operator << (std::ostream& out, const vector<T>& v)
	{
		for (auto& e : v)
		{
			out << e << " ";
		}
		return out;
	}
}
	

二、解决:

1. 问题

其实,问题在这里:

friend std::ostream& operator <<(std::ostream& out, const vector<T>& v);
//
//
template <class T>
std::ostream& operator << (std::ostream& out, const vector<T>& v)
{
	for (auto& e : v)
	{
		out << e << " ";
	}
	return out;
}

大家有看出问题吗?
是类内声明友元的时候,没有 template <class T> 的声明。

在这里插入图片描述
添加上 template<class T> 之后,程序就可以正常的运行了。
但是,定义 vector 类的时候,不是有声明 T 模板类型吗,为什么这里不能用类的 template 声明,而要再写一遍?

在这里插入图片描述

2. 解释

一次 template 可以控制的范围,我总结为:物理范围+逻辑范围。

① 类模板

类模板托管写在类内的属于类的成员:
在这里插入图片描述

  • 写在类外的成员函数
    当类模板的成员函数写在类外时,每个成员函数都要单独写 template(不知道大家知不知道这一点),如下:
    在这里插入图片描述
    其实此时的成员函数已经超出类的 template 声明的范围了,我们大概可以这样理解:
    在这里插入图片描述

  • 友元函数
    对于友元,它根本不属于类,所以不能使用人家类的 template 声明,而你自己又是一个函数模板,所以自然要自己声明了:
    在这里插入图片描述
    当在类内声明友元时,即使声明的代码没有用到模板类型(T),也要声明 template,如果不声明 template ,它会认为是一个普通函数,而函数定义处,定义的是一个函数模板,两个对不上,会报错:
    在这里插入图片描述

② 函数模板

函数模板托管的就是下面紧接着的一个函数:
普通的函数模板没什么要说的,但关于成员函数成为了一个函数模板,还是有必要提一下的:
在这里插入图片描述
所以,我们可以看到,类模板的成员函数本身是普通函数,但也是可以成为函数模板的,一旦成为函数模板,那使用的时候就要注意一下了。


本文到这里就结束了,如果对您有帮助,希望得到您的一个赞!🌷
如果有哪里有问题,希望大家评论指出或跟我讨论,感谢大家!
祝大家每天进步!😄

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值