Перегрузка оператора вставки C++ (<<)
Я работаю над назначением, в котором я должен перегрузить оператор вставки, чтобы взять объект узла. Я создал функцию перегрузки оператора вне определения класса,но внутри узла.H файл. Все компилируется нормально, но перегруженный оператор не вызывается, вместо этого я получаю простой адрес объекта.
Мне запрещено изменять вызывающий код, поэтому любые изменения должны быть связаны с перегрузкой оператора.Мой код в том виде, в каком он есть. теперь:
/** 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";
2 ответа:
Обратите внимание, что тип параметра
Короче говоря, вы не можете привязать ссылку на non-const к объекту с другим типом.pHead
является ссылкой на неконст,const Node<T>*
является неконст-указателем на const, тип аргументаn
являетсяNode<T>*
(т. е. неконст-указателем на неконст). Их тип не совпадает,Node<T>*
необходимо преобразовать вconst Node<T>*
, который является временным и не может быть привязан к ссылке на неконст.Но ссылка на const может быть привязана к временному, так что вы можете измените тип параметра на ссылку на const:
template<class T> inline std::ostream & operator << (std::ostream & out, const Node <T> * const & pHead) // ~~~~~
Или измените его на переданное значение,
Node<T>*
будет неявно преобразовано вconst Node<T>*
при передаче в качестве аргумента. (Передача указателя по ссылке на const не имеет большого смысла.)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)
Проблема заключается в том, что вставщик принимает параметр типа
Но, как намекнуто в комментарии, наличие вставщика, который берет указатель на тип, - плохая идея. Он должен взятьconst Node<T>*
, но он вызывается с аргументом типаNode<T>*
; нет преобразования изT*
вconst T*
. Таким образом," исправление " заключается в удаленииconst
из потока inserter.const Node<T>&
, как и все другие вставщики в мире. Я полагаю, что это ограничение, наложенное заданием; если так, то это идиотизм. Ты учили плохо.