Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2013, 00:05   #1
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию Перегрузка вывода шаблонного класса

Есть у меня класс. Допустим, такой:

Код:
class Array
{
	int* pArray;
	int size;
public:
	Array(int size = 0, int data = 0);
	~Array();
	friend ostream& operator<<(ostream& os,const Array &ar);
};
Хочу сделать его шаблонным. Как переписать функцию "operator<<"?
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 16.03.2013, 01:14   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Код:
template <typename T>
class Array {
public:
	template <typename> friend ostream& operator<<(ostream& os,const T &ar);
};

template <typename T>
ostream& operator<<(ostream& os,const T &ar)
{ return os; }
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 16.03.2013, 03:18   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Код:
(ostream& os,const T &ar)
T? Не Array<T>?

В любом случае вылазит ошибка
error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "Array<T>" (или приемлемое преобразование отсутствует)
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 16.03.2013, 10:21   #4
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

я вот так делаю:
http://codepad.org/l5savXJw

кстати, сам синтаксис обычно не пишу ручками, а копипастю с сайта http://programmersforum.ru

Здесь эта тема неоднократно поднималась, поэтому легко гуглится, и соответственно - легко копипастится.


(копипаст - основа всех языков. Самый мощный паттерн программирования)
_Bers вне форума Ответить с цитированием
Старый 16.03.2013, 15:20   #5
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Цитата:
Здесь эта тема неоднократно поднималась
Ну звыняйте, у меня как-то ума не хватило искать это по запросу "Что бы это могло быть?" или "Здравствуйте!у меня зачет,а я в с++ вообще не шарю..." или "friend в шаблоне". А две адекватные темы эта и эта ничего мне не дали. А перелопачивать 250 тем (да-да, именно столько их и по запросу template, и по запросу ostream&) как-то особо времени нет.

Собственно, попытка вставить приведенный вами код в мою прогу, выдала результат
Цитата:
бинарный "<<": не найден оператор, принимающий правый операнд типа "Array<T>" (или приемлемое преобразование отсутствует)
Код из этой темы убрал предыдущие ошибки, но пришлось убрать const из функции.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать

Последний раз редактировалось ACE Valery; 16.03.2013 в 15:26.
ACE Valery вне форума Ответить с цитированием
Старый 17.03.2013, 15:44   #6
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от ACE Valery Посмотреть сообщение
Собственно, попытка вставить приведенный вами код в мою прогу, выдала результат
Я вам выше предоставил линк с рабочим кодом.
А вот что именно, и как вы его в свою прогу вставляли - телепаты в отпуске.

Последний раз редактировалось _Bers; 17.03.2013 в 15:48.
_Bers вне форума Ответить с цитированием
Старый 18.03.2013, 12:15   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2ACE Valery
точно, не сразу догнал, что нужно.
http://ideone.com/9XAa05

очередной пример непродуманности языка, возможности которого вроде как нормально работают сами по себе, но плохо кореллируют друг с другом.
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 18.03.2013, 14:42   #8
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

_Bers, нууу... у вас-то он, может, и рабочий, а вот у меня нет. Не буду заморачиваться с объяснениями, как я этот код вставляла. Вот сейчас тупо скопипастила ваш код в пустой проект. Результат:
Цитата:
1>------ Построение начато: проект: testTemplateOstream, Конфигурация: Debug Win32 ------
1> main.cpp
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
1> d:\cppprojects\testtemplateostream\ main.cpp(12): см. ссылку на создание экземпляров класса шаблон при компиляции "Array<T>"
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2433: ostream: "friend" не разрешается для объявлений данных
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2238: непредвиденные лексемы перед ";"
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2804: бинарный "operator <<" имеет слишком много параметров
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2143: синтаксическая ошибка: отсутствие ";" перед "<end Parse>"
1>d:\cppprojects\testtemplateostrea m\main.cpp(11): error C2238: непредвиденные лексемы перед ";"
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2143: синтаксическая ошибка: отсутствие ";" перед "&"
1> d:\cppprojects\testtemplateostream\ main.cpp(18): см. ссылку на создание экземпляров класса шаблон при компиляции "Array<T>"
1> with
1> [
1> T=int
1> ]
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2433: ostream: "friend" не разрешается для объявлений данных
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2238: непредвиденные лексемы перед ";"
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2804: бинарный "operator <<" имеет слишком много параметров
1>d:\cppprojects\testtemplateostrea m\main.cpp(6): error C2143: синтаксическая ошибка: отсутствие ";" перед "<end Parse>"
1>d:\cppprojects\testtemplateostrea m\main.cpp(11): error C2238: непредвиденные лексемы перед ";"
1>d:\cppprojects\testtemplateostrea m\main.cpp(20): error C2679: бинарный "<<": не найден оператор, принимающий правый операнд типа "Array<T>" (или приемлемое преобразование отсутствует)
1> with
1> [
1> T=int
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\ostream(679): может быть "std::basic_ostream<_Elem,_Trai ts> &std:perator <<<char,std::char_traits<char>>(std ::basic_ostream<_Elem,_Traits> &,const char *)" [найдено при поиске с зависимостью от аргументов]
... ну и в том же духе, просто в сообщение не влазит
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
но все равно спасибо за участие


pproger, сенкс! Тошонадо!
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 18.03.2013, 14:58   #9
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
_Bers, нууу... у вас-то он, может, и рабочий, а вот у меня нет. Не буду заморачиваться с объяснениями, как я этот код вставляла. Вот сейчас тупо скопипастила ваш код в пустой проект. Результат:
вроде бы должно работать, но std:: перед ostream в шестой строке вроде бы не хватает.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов методов шаблонного класса. the_deer_one C# (си шарп) 2 13.08.2012 17:22
Один и тот же код на С++ и С#, Шаблоны, отображение содержимого шаблонного класса pinkiller Общие вопросы .NET 2 01.06.2012 12:22
наследник шаблонного класса Rayzor Общие вопросы C/C++ 9 03.05.2012 16:50
Конструктор шаблонного класса Hemul Общие вопросы C/C++ 1 01.07.2011 20:21
С++ перегрузка операций для шаблонного класса TIN Помощь студентам 7 29.03.2009 15:24