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

环境 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);

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

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

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

上一篇:【小波神经网络】关于用小波包变换+BP神经网络分析齿轮箱故障的研究


下一篇:剑指Offer #29 顺时针打印矩阵