Нас научили перегружать 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 состояние выхода, ошибка создания сборки
Если бы кто-то мог помочь мне с перегрузкой, это было бы здорово, потому что я думаю, что это единственная проблема, которая у меня осталась, чтобы я мог разобраться во всем остальном.
Спасибо!!
Вам нужно выполнить какую-то итерацию над 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
на первом месте. Списки обычно предоставляют доступ к своим элементам в общедоступном интерфейсе.
List<T>
«s operator<<
следует перебирать каждый элемент типа T
в списке и позвоните output << element;
на каждой.
Затем убедитесь, что каждый тип T
что вы создаете List<T>
Объект также реализует operator<<
которая выводит каждую переменную, которую вы хотите, в том формате, в котором вы хотите, например: output << "(" << x << "," << y << ")"
, Встроенные типы уже делают это, например, List<int>
не будет требовать этого шага.
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
определение класса.)