2012-04-28 2 views
1

Мне нужно перегрузить оператор вставки для просмотра объектов класса в формате матрицы. Я написал код, но что-то не так. Когда я включаю это в свой код и пытаюсь построить, компилятор дает мне массу ошибок; когда я прокомментировал эту часть, ошибки исчезли, и программа работает правильно. Вот код:Что случилось с перегрузкой оператора вставки? (<< operator)

template <class itemType> 
ostream & operator<< (ostream & os, const Storage2D<itemType> & rhs) 
{ 
    node<itemType>* ptrRow = rhs.head; 
    node<itemType>* ptrColumn = rhs.head; 
    for(; ptrColumn->down != NULL; ptrColumn = ptrColumn->down) 
    { 
     ptrRow = ptrColumn; 
     for(; ptrRow->right != NULL; ptrRow = ptrRow->right) 
     { 
      os << ptrRow->info << setw(10); 
     } 
     os << ptrRow->info << setw(10) << endl; 
    } 

    return os; 
} 

Вот как я пытался использовать перегрузки от основной функции:

Storage2D<double> m(row, column); 
cout << m; 

Это не является функцией-членом класса Storage2D написано, выходит за рамки класса Storage2D в файле реализации.

Было бы здорово, если вы поможете мне, спасибо заранее.

EDIT: Вот остальная часть моего кода. Файл Storage2D.h:

template <class itemType> 
struct node 
{ 
    itemType info; 
    node* right; 
    node* down; 

    node() 
    {} 

    node(itemType data, node* r = NULL, node* d = NULL) 
    { 
     info = data; 
     right = r; 
     down = d; 
    } 
}; 

template <class itemType> 
class Storage2D 
{ 
public: 
    Storage2D(const int & , const int &);  //constructor 
    //~Storage2D();        //destructor 
    //Storage2D(const Storage2D &);    //deep copy constructor 

private: 
    node<itemType>* head; 
}; 

ostream& operator<< (ostream & os, const Storage2D & rhs); 

#include "Storage2D.cpp" 
+3

Нам нужно увидеть сообщения об ошибках. В идеале вы также покажете нам небольшой (<100 строк) автономный тестовый пример, который демонстрирует проблему; кода, который вы показали, недостаточно, чтобы знать, что не так. – zwol

+2

Как правило, когда вы спрашиваете, как исправить проблему природы «если я делаю X, я получаю ошибки», вы должны включить в вопрос копию, по крайней мере, первой из этих ошибок. –

+0

при угадывании вам нужно сделать оператора другом, но нам нужна ошибка, чтобы быть уверенным. – 111111

ответ

2

head является частным, поэтому оператор должен быть другом, поэтому он может получить доступ к этому члену данных. Он также должен быть объявлен как шаблон функции, так как Storage2D шаблон класса:

#include <iostream> // for std::ostream 

template <class itemType> 
class storage2D { 
// as before 
template <typename T> 
friend std::ostream& operator<< (std::ostream & os, const Storage2D<T> & rhs); 
}; 

// declaration 
template <typename T> 
std::ostream& operator<< (std::ostream & os, const Storage2D<T> & rhs); 

Обратите внимание, что я явно использовал std::ostream, поскольку ostream находится в std пространстве имен.

+0

Это исправление помогло много ошибок, но все же 4 ошибки. Я предполагаю, что он не распознает ostream & как возвращаемый тип. Должен ли я включать некоторые библиотеки для его использования?

 syntax error : missing ';' before '&' \t syntax error : missing ';' before '' \t missing type specifier - int assumed. Note: C++ does not support default-int missing type specifier - int assumed. Note: C++ does not support default-int All for this line: ostream& operator<< (ostream & os, const Storage2D & rhs);

+0

@MertToka Возможно, вы не указали , и вам, вероятно, нужно использовать пространство имен 'std'. Я отредактировал свой ответ. – juanchopanza

+0

Большое спасибо, он, наконец, работает. Кстати, я извиняюсь за плохое редактирование моих команд. Я совершенно незнакомы с кодами HTML. –

 Смежные вопросы

  • Нет связанных вопросов^_^