Перегрузка оператора вставки 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 2

2 ответа:

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

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

Но ссылка на 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>&, как и все другие вставщики в мире. Я полагаю, что это ограничение, наложенное заданием; если так, то это идиотизм. Ты учили плохо.