运算符<< C++ 中的重载

operator << overloading in c++

本文关键字:重载 C++ 运算符      更新时间:2023-10-16

我做了这个代码

声明:

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 会找到它,无论如何这就是你想要的。