Как перегрузить & lt; & lt; cout для шаблона класса?

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

 template <NODETYPE>
friend ostream &operator <<(ostream &, List<NODETYPE>& );template<typename NODETYPE>
ostream &operator <<(ostream& output, List<NODETYPE>& value)
{
output << value;
return output;
}

Тем не менее, моя программа имеет по крайней мере 5 объектов для вывода, и два из них двойные. Я получаю сообщение об ошибке, в котором говорится, что «double не является допустимым типом для параметра константы шаблона»

Мои две проблемы: как вывести все мои объекты, а не только первый объект; и как я могу получить двойной на выходе. Пожалуйста и спасибо!

РЕДАКТИРОВАТЬ: ОГРОМНОЕ РЕДАКТИРОВАНИЕ :::

Хорошо, я понял, что я делаю что-то не так, переставил заголовок и исходные файлы.

А потом я также понял, что пропустить мой лекторский класс было одной из самых больших ошибок, которые я когда-либо совершал. Моей следующей ошибкой было дать вам все мои предположения, а не информацию, которую я предположил.

В моем назначении говорится: • Напишите оператор назначения и функцию друга для вывода связанного списка.

почти в каждой строке моей главной функции (функции, которую мне запрещено изменять) есть cout:

List<int> Li, Li2, Li3;
List<double> Ld, Ld2;

Это мои объекты. И все мои койки выглядят примерно так:

  cout << "Ld is: " << Ld << endl;

После перестановки моих заголовочных и исходных файлов я получил эту ошибку:
оператор «нет совпадения»<<‘in’ std :: operator<<[with_Traits = std :: char_traits] (((std :: basic_ostream>&) (& std :: cout)), ((const char *) ‘Ld is «))<

Я получаю это за каждое заявление, которое у меня есть. Это больше информации, чем состояние выхода Ld равно 1 или что-то еще, так что я иду из этого.

Я до сих пор не очень заинтересован в использовании этой функции перегрузки Ostream, поэтому любая помощь приветствуется и большое спасибо за ваше время!

РЕДАКТИРОВАТЬ::—

Я поместил почти весь мой код в этом посте: collect2: Ld вернул 1 состояние выхода, ошибка создания сборки

Если бы кто-то мог помочь мне с перегрузкой, это было бы здорово, потому что я думаю, что это единственная проблема, которая у меня осталась, чтобы я мог разобраться во всем остальном.

Спасибо!!

2

Решение

Вам нужно выполнить какую-то итерацию над List<NODETYPE>, распечатывая каждый узел. В противном случае вы получите бесконечную рекурсию с оператором, вызывающим себя.

В этом примере выводятся элементы, разделенные одним пробелом в одну строку. Я опустил детали механизма итерации, потому что я не знаю ваш List интерфейс.

template<typename NODETYPE>
ostream &operator <<(ostream& output, const List<NODETYPE>& value)
{
for ( node in value) // pseudocode iteration
{
output << node << " ";
}
return output;
}

Это предполагает, что есть ostream& operator<< для типов узлов, если нет, вы должны предоставить это тоже. Также обратите внимание, что я передаю список const reference, Это имеет много преимуществ, одним из которых является то, что вы можете передавать временные объекты.

Касательно friend Декларация, вам также нужно template<typename T> есть, но не ясно, нужен ли вам оператор friend на первом месте. Списки обычно предоставляют доступ к своим элементам в общедоступном интерфейсе.

1

Другие решения

List<T>«s operator<< следует перебирать каждый элемент типа T в списке и позвоните output << element; на каждой.

Затем убедитесь, что каждый тип T что вы создаете List<T> Объект также реализует operator<< которая выводит каждую переменную, которую вы хотите, в том формате, в котором вы хотите, например: output << "(" << x << "," << y << ")", Встроенные типы уже делают это, например, List<int> не будет требовать этого шага.

0

1) friend декларация не нужна, если только NODETYPE вы хотите использовать в качестве аргумента шаблона это класс, который вы определили сами, а также operator<< вы определяете хочет получить доступ к любым частным членам NODETYPE, Кажется, прямо сейчас, NODETYPE является doubleтак что нет необходимости в friend декларация.

Если у вас есть другие типы данных, которые вы хотите использовать в качестве аргументов шаблона, а эти другие типы данных являются вашими собственными классами, установите friend декларация внутри эти классы. (Это может быть верно для List типа, как описано ниже).

2) Прямо сейчас, ваш operator<< является рекурсивным Вы должны (как подсказывают другие ответы) как-то перебирать список NODETYPE объекты, которые вы получаете:

for(List::const_iterator it = value.begin() ; it != value.end() ; ++it)
output << *it;

(Вышесказанное предполагает, что ваш List типы данных begin(), end() и итераторы. Вы можете использовать другой способ перебора элементов List, Для этого вам может потребоваться доступ к частным членам List тип данных, в этом случае вы должны объявить operator<< как шаблон друга (в том числе typename!) внутри List определение класса.)

0