环境 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? basicostream@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);
希望有大佬可以解答一下。
至于其他的运算符还没有试过 有兴趣的同学可以试一下。
第一次发文章 如有不足 望大家多多包涵 谢谢各位。