重载<<运算符导致无输出

时间:2013-08-07 21:24:17

标签: c++ operator-overloading output

我不确定我是否正确地重载<<运算符。以下代码编译没有问题,但不会产生预期的输出。

#include <iostream>
#include "Matrix.h"

template<class T>
std::ostream& operator<<(std::ostream &out, const matrix<T> &A)
{
    for(int ii = 0; ii << A.size(1); ii++)
    {
        for(int jj = 0; jj < A.size(2); jj++)
        {
            out << A(ii,jj) << " ";
        }
        out << std::endl;
    }
    return out;
}

int main(int argc, char** argv)
{
    matrix<double> A = {{1.0, 2.0},{1.0,-1.0}};
    cout << "\"" << A << "\"\n";

    return 0;
}

唯一的输出是: ""

Matrix.h

template<class T>
class matrix
{
public:
    matrix(int rows, int cols);
    matrix(const std::initializer_list<std::initializer_list<T>>& lst);
    T& operator()(int i, int j);
    T operator()(int i, int j) const;
    int size(int n) const;

private:
    int mRows;
    int mCols;
    std::vector<T> mData;
};

template<class T>
matrix<T>::matrix(int rows, int cols)
: mRows(rows),
mCols(cols),
mData(rows * cols)
{
}

template<class T>
matrix<T>::matrix(const std::initializer_list<std::initializer_list<T> >& lst)
    : matrix(lst.size(), lst.size() ? lst.begin()->size() : 0)
{
    int ii = 0, jj = 0;
    for(const auto& l : lst)
    {
        for(const auto& v : l)
        {
            mData[ii*mCols + jj] = v;
            jj++;
        }
        jj = 0;
        ii++;
    }
}

template<class T>
T& matrix<T>::operator()(int i, int j)
{
    return mData[i*mCols + j];
}

template<class T>
T matrix<T>::operator()(int i, int j) const
{
    return mData[i*mCols + j];
}

template<class T>
int matrix<T>::size(int n) const
{
    if(n == 1)
    {
        return mRows;
    }
    else if(n == 2)
    {
        return mCols;
    }
}

1 个答案:

答案 0 :(得分:6)

在你的第一个for循环中,你有:

for(int ii = 0; ii << A.size(1); ii++)
                   ^

那应该是一个<字符:

for(int ii = 0; ii < A.size(1); ii++)
                   ^

它没有做任何事情的原因是因为原始循环导致条件为0 << A.size(1),即0false;因此,永远不会执行外部循环。