2

Я работаю над назначением, в котором я должен перегрузить оператор вставки, чтобы взять объект Node. Я создал функцию перегрузки оператора вне определения класса, но внутри файла node.h. Все компилируется отлично, но перегруженный оператор не вызывается, вместо этого я получаю простой адрес объекта.C++ Вставка оператора перегрузки (<<)

Мне запрещено изменять код вызова, поэтому любые изменения должны быть перегружены оператором.

Мой код, как он стоит прямо сейчас:

/** OPERATOR << ***********************************/ 
template<class T> 
inline std::ostream & operator << (std::ostream & out, const Node <T> *& pHead) 
{ 
    out << "INCOMPLETE"; 
    return out; 
} 

Прямо сейчас, я просто хочу, чтобы обеспечить перегруженный оператор называется. Я исправлю выходной код, как только узнаю, что я вызываю правильный оператор.

Вызывающий код:

// create 
Node <char> * n = NULL; 

// code modifying n 

// display 
cout << "\t{ " << n << " }\n"; 
+0

'соиЬ << * п, 'было бы простое решение –

+0

Это верно, но, как говорится, я не могу изменить код вызова. – ThomasNichols89

+0

извините, пропустите эта часть. –

ответ

3

Заметит, что параметр pHead «сек Типа является ссылкой на неконстантный, const Node<T>* не является константным указателем на константном, аргумент n» ы типа Node<T>* (т.е. Неконстантного указателя на неконстантный) , Их тип не соответствует, Node<T>* необходимо преобразовать в const Node<T>*, что является временным и не может быть привязано к ссылке на неконстантный.

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

Но ссылка на сопзЬ может быть связана с временным, так что вы можете изменить тип параметра для ссылки на константный:

template<class T> 
inline std::ostream & operator << (std::ostream & out, const Node <T> * const & pHead) 
//                  ~~~~~ 

Или изменить его переданный по значению, Node<T>* будет неявно преобразован в const Node<T>* при передаче в качестве аргумента. (Передача указатель со ссылкой на сопзЬ не имеет особого смысла.)

template<class T> 
inline std::ostream & operator << (std::ostream & out, const Node <T> * pHead) 

наконец, перегрузка operator<< с типом указателя выглядит странно. Наиболее распространенной формой с определенного пользователем типа будет:

template<class T> 
std::ostream & operator << (std::ostream & out, const Node <T> & pHead) 
+0

Благодарим вас за разъяснение деталей использования констант и ссылочных типов. Последний блок кода - это то место, где я начал, но модератору класса мне сообщили, что ему нужно взять указатель. Первый блок кода, который вы опубликовали, отлично работает (для этого задания в любом случае.) Я буду держать вас в курсе лучших практических советов, чтобы двигаться вперед. – ThomasNichols89

1

Проблема заключается в том, что вставки принимает параметр типа const Node<T>*, но он вызывается с аргументом типа Node<T>*; нет конверсии от T* до const T*. Таким образом, «исправить» следует удалить const из вставки потока.

Но, как намекнул в комментарии, наличие вставки, которая берет указатель на тип, является плохой идеей. Он должен принимать const Node<T>&, как и все другие вставки в мире. Я понимаю, что это ограничение, налагаемое заданием; если да, то это идиот. Вас плохо преподают.

+0

Вы правы, что это ограничение класса. Курс позволяет нам создать класс Node и некоторые независимые функции. На следующей неделе мы возьмем класс Node и эти функции и свернем их в класс Doubly Linked List. До сих пор (5 недель) все другие структуры данных использовали общий метод, который вы указали.Я считаю, что эта неделя отличается от того, что класс Node не является полным абстрактным типом данных. – ThomasNichols89

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