неопределенная ссылка и оператор << vs me - PullRequest
0 голосов
/ 21 сентября 2018

я пытаюсь использовать operator << в моем коде, но я получил эту ошибку <strong>operator & << (std :: ostream &, matrix) </strong> вот мой код

#include <iostream>
#include <iomanip>
#include <cassert>
using namespace std;
// A structure to store a matrix
struct matrix
{
    int** data;       // Pointer to 2-D array that will simulate matrix
    int row, col;
};
void createMatrix (int row, int col, int num[], matrix& mat);
int main()
{
    int data1 [] = {1,2,3,4,5,6,7,8};
    int data2 [] = {13,233,3,4,5,6};
    int data3 [] = {10,100,10,100,10,100,10,100};

    matrix mat1, mat2, mat3;
    createMatrix (4, 2, data1, mat1);
    createMatrix (2, 3, data2, mat2);
    createMatrix (4, 2, data3, mat3);
cout<<mat1<<endl;
return 0;
}
ostream& operator<< (ostream& output, matrix& mat)
{
for(int i=0; i<mat.row; i++)
    {
        for(int j=0; j<mat.col; j++)
        {
            output<<mat.data[i][j];
        }
    }
    return output;
}

как я могу справиться с этой проблемой?

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Это потому, что вы используете operator<<(std::ostream&, matrix&) до того, как оно будет объявлено.

Возможные решения:

  • Добавьте предварительное объявление перед основным.
  • Переместите определениедо main.

НО , поскольку оператор вывода тесно связан с классом matrix, почему бы не объявить его другом класса?Таким образом, вы явно документируете тесную связь оператора вывода с классом.

struct matrix
{
    int** data;       // Pointer to 2-D array that will simulate matrix
    int row, col;

    // Note the output operator should not modify the object.
    // So you can pass it as a const reference in the second parameter.
    friend std::ostream& operator<<(std::ostream& output, matrix const& mat)
    {
        for(int i=0; i < mat.row; ++i)     // prefer prefix increment.
        {
            for(int j=0; j < mat.col; ++j)
            {
                output << mat.data[i][j] << " ";
            }
            output << "\n";
        }
        return output;
    }
};
0 голосов
/ 21 сентября 2018

Ваш оператор определен после того, как он используется, поэтому компилятор не знает, что такой оператор существует в этой точке.Вам нужно переместить определение оператора перед использованием или, что еще лучше, просто объявить его до main() и после того, как struct matrix определено или объявлено:

 ostream& operator<< (ostream& output, matrix& mat);

примечание: он должен использовать ссылку на const, как вы это делаетене имеет намерения изменить этот объект:

 ostream& operator<< (ostream& output, const matrix& mat);

, что также заставит этот оператор работать с временным объектом и т. д., что не будет с неконстантной ссылкой.

...