运算符<< C++ 中的重载
operator << overloading in c++
我做了这个代码
声明:
template <class T>
class Matrix
{
std::vector< std::vector<T> > mat;
size_t rows , cols;
public:
Matrix<T>();
Matrix<T>(const std::string);
Matrix(const size_t r, const size_t c, const std::vector<T> v);
Matrix<T> operator=(const Matrix<T> &other);
friend std::ostream& operator<<(std::ostream &os , Matrix<T> m);
};
功能:
template <class T>
std::ostream& operator<<(std::ostream &os , Matrix<T> m){
for (size_t i = 0; i < m.rows; i++)
{
for (size_t j = 0; j < m.cols; j++)
{
os << m.mat[i][j] << " ";
}
os << std::endl;
}
return os;
}
主要:
int main(){
std::vector<int> v(9);
v[0] = 1;
v[1] = 2;
v[2] = 3;
v[3] = 4;
v[4] = 5;
v[5] = 6;
v[6] = 7;
v[7] = 8;
v[8] = 9;
Matrix<int> m = Matrix<int>(2, 3, v);
std::cout << m;
}
我收到此错误:
错误1 错误 LNK2019:未解析的外部符号"类" std::basic_ostream> & __cdecl 运算符<<(类标准::basic_ostream
&,类矩阵)"(??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@V?$Matrix@H@@@Z) 在函数 C:\Users\igor\documents\visual studio 中引用_main 2013\项目\矩阵\矩阵\来源.obj 矩阵
我试图在没有朋友的情况下写它,但遇到了不同的错误。
我做错了什么?
您必须在头文件中实现一个模板,而不仅仅是在那里声明它。
当然,除非您可以显式实例化所有需要的专业化。
无论如何,请考虑内联定义friend
:
template <class T>
class Matrix
{
//...
friend std::ostream& operator<<(std::ostream &os , Matrix<T> m) {
// do things
return os;
}
};
除非在包含作用域中声明它,否则无法显式调用它,但 ADL 会找到它,无论如何这就是你想要的。
相关文章:
- 继承函数的重载解析
- 你能重载对象变量名本身返回的内容吗
- 从父命名空间重载类型
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 重载操作程序时出错>>用于类中的字符串 memebr
- 一个关于在C++中重载布尔运算符的问题
- 不同翻译单元中不可重载的非内联函数定义
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 将重载的成员函数传递给函数模板
- c++:可变模板和函数重载
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 重载==不适用于二进制树
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 重载运算符new[]的行为取决于析构函数
- 正在尝试重载二进制搜索树分配运算符
- 重载Singly Linked List中的赋值运算符
- 取消引用运算符不能重载