c++ - 在模板类中重载 istream>> 和 ostream<<
问题描述
我想在模板类中重载 >> 和 << 并且我遇到了一些错误。
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "class std::basic_istream<char,struct std::char_traits<char> > & __cdecl operator>>(class std::basic_istream<char,struct std::char_traits<char> > &,class MatricePatratica<int> &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$MatricePatratica@H@@@Z) referenced in function _main ConsoleApplication3 C:\Users\Octavian\source\repos\ConsoleApplication3\ConsoleApplication3\Source.obj 1
Error LNK2019 unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class MatricePatratica<int> const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABV?$MatricePatratica@H@@@Z) referenced in function _main ConsoleApplication3 C:\Users\Octavian\source\repos\ConsoleApplication3\ConsoleApplication3\Source.obj 1
Error LNK1120 2 unresolved externals ConsoleApplication3 C:\Users\Octavian\source\repos\ConsoleApplication3\Debug\ConsoleApplication3.exe 1
AFAIK 当一个函数被声明但未实现时会发生这种情况。我收到那些重载错误>> <<(如您在上面看到的)
唯一的事情是我实现了这些功能,所以我希望它能够工作。但我可能会遗漏一些东西。
这是我的模板类
#pragma once
template <typename T>
class MatricePatratica
{
private:
T** date;
int n = 0;
public:
MatricePatratica();
MatricePatratica(int);
MatricePatratica(const MatricePatratica&);
friend std::istream& operator>>(std::istream& is, MatricePatratica<T>& obj);
friend std::ostream& operator<<(std::ostream& os, const MatricePatratica<T>& obj);
};
template<typename T>
inline MatricePatratica<T>::MatricePatratica()
{
}
template<typename T>
inline MatricePatratica<T>::MatricePatratica(int n) :n(n)
{
date = new int* [n];
for (int i = 0; i < n; i++)
{
date[i] = new int[n];
}
}
template<typename T>
inline MatricePatratica<T>::MatricePatratica(const MatricePatratica& deCopiat)
{
date = new int* [deCopiat->n];
for (int i = 0; i < deCopiat->n; i++)
{
date[i] = new int[deCopiat->n];
}
for (int i = 0; i < deCopiat->n; i++)
{
for (int j = 0; j < deCopiat->n; j++)
{
date[i][j] = deCopiat[i][j];
}
}
}
template <typename T>
std::istream& operator>>(std::istream& is, MatricePatratica<T>& obj)
{
for (int i = 0; i < obj.n; i++)
{
for (int j = 0; j < obj.n; j++)
{
is >> obj.date[i][j];
}
}
return is;
}
template <typename T>
std::ostream& operator<<(std::ostream& os, const MatricePatratica<T>& obj)
{
for (int i = 0; i < obj.n; i++)
{
for (int j = 0; j < obj.n; j++)
{
os << obj[i][j] << " ";
}
os << std::endl;
}
return os;
}
这是主文件:
#include <iostream>
#include "MatricePatratica.h"
int main()
{
MatricePatratica<int> test(5);
std::cin >> test;
std::cout << test;
}
为什么我会收到此错误,我应该如何解决?
解决方案
问题是你已经声明了一个不是模板的东西的友谊!
所以编译器试图找到:
std::istream& operator>>(std::istream& is, MatricePatratica<int>& obj)
哪个不存在,实际上它应该使用:
// note extra template parameter:
std::istream& operator>><int>(std::istream& is, MatricePatratica<int>& obj)
要修复它,您需要向这些运算符的模板声明友谊:
template <typename T>
class MatricePatratica
{
....
template<typename U>
friend std::istream& operator>>(std::istream& is, MatricePatratica<U>& obj);
template<typename U>
friend std::ostream& operator<<(std::ostream& os, const MatricePatratica<U>& obj);
};
修复错字后,它可以工作:https ://wandbox.org/permlink/gHEmap8zCCTyBjRA
推荐阅读
- julia - 如何使用选项暂停和恢复以在 Julia 中保持跟踪
- azure - 如何仅授予 Azure Functions 特定的 Graph 权限(一个共享点库)
- scala - JSON数组的爆炸列
- ios - 如何公开提供动态数据但在编译时可访问的 API?
- javascript - 调用 fs.readdir 函数后变量为空
- excel - 如何使以下 iif 函数提供给定的结果?
- listview - Xamarin.Forms,仅限 iOS,作为 ViewCell 视图的框架的内容显示在列表中其他行的顶部
- javascript - 如何对antd表中的布尔列进行排序?
- linux - 在Linux中获取时钟设备的频率
- python - Python解析字符串值并加载到字典中