ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LNK2019 无法解析的外部符号 “class std::basic_ostream<char,struct std::char_traits

2021-12-12 16:07:37  阅读:218  来源: 互联网

标签:std 运算符 LNK2019 const Matrix char operator 声明 模板


环境 VS2019

今天在编写矩阵类的类模板及运算符的重载时 编译前没有问题 运行时提示下面错误:

禁止显示状态 错误 LNK2019 无法解析的外部符号 “class std::basic_ostream<char,struct std::char_traits > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits > &,class Matrix const &)” (??6@YAAAV? b a s i c o s t r e a m @ D U ? basic_ostream@DU? basico​stream@DU?cha

经过反复查找测试 最终发现是在类内声明友元函数时需要进行类模板声明

分为两种情况

在重载运算符后加入模板参数 这种情况下其他类名后可不加类模板参数:

friend Matrix operator+<T>(const  Matrix& l, const Matrix& r);

可以在代码前加上类模板声明 但是只要带模板声明 就必须带有模板参数

template<typename T>
	friend Matrix<T> operator+(const  Matrix<T>& l, const Matrix<T>& r);

不过两者的作用都是相同的。

如果函数是在类内定义时 不需要加类模板声明及参数

但是我发现在进行运算符 * 的重载时 第一种方法声明不可以 不知道为什么

只能使用第二种方法声明:

template<typename T>
	friend Matrix<T> operator*( const Matrix<T>& l, const Matrix<T>& r);

希望有大佬可以解答一下。

至于其他的运算符还没有试过 有兴趣的同学可以试一下。

第一次发文章 如有不足 望大家多多包涵 谢谢各位。

标签:std,运算符,LNK2019,const,Matrix,char,operator,声明,模板
来源: https://blog.csdn.net/m0_52674486/article/details/121887822

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有