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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 17:42   #1
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию Проблемы с оператором '<<' в шаблонных классах

В общем, не буду мудрить, есть у меня вот такой код.

Код:
#include <iostream>
#include <cstdlib>

#include "Matrix.h"

using namespace std;
using namespace mtx;

template <class TYPE>
class A
{
	friend ostream& operator<< (ostream&, A&);
};

template <class TYPE>
ostream& operator<< (ostream& out, A<TYPE>& a)
{
	out << 5;
}

int main(void)
{
	A<int> a;

	cout << a;

	system("PAUSE");
		
	return 0;
}
Т.е. очевидно, что в консольке должно быть выведено 5.

Имею вот такую ошибку:

Цитата:
Ошибка 1 error LNK2019: ссылка на неразрешенный внешний символ "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class A<int> &)" (??6@YAAAV?$basic_ostream@DU?$char_ traits@D@std@@@std@@AAV01@AAV?$A@H@ @@Z) в функции _main C:\Users\Computer\Documents\Visual Studio 2010\Projects\Professional\CPlusPlu s\CPlusPlus\main.obj CPlusPlus
Если вместо
Код:
template <class TYPE>
ostream& operator<< (ostream& out, A<TYPE>& a)
{
	out << 5;
}
Написать, к примеру:
Код:
ostream& operator<< (ostream& out, A<int>& a)
{
	out << 5;
}
т.е. сделать частную реализацию, то вуаля, всё работает.

Не могу понять в чем пичаль-беда.

Пишу в Visual Studio 2010.

P.S.
Прошу прощения за столь обрывочный текст, я тороплюсь немного + уже не знаю что поделать, поэтому зол немного.
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 05.03.2013 в 18:17.
MooNDeaR вне форума Ответить с цитированием
Старый 05.03.2013, 18:18   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

friend и шаблоны вообще друг с другом хреново взаимодействуют, грабли известные.
Первое решение - определять operator<< в теле класса. Должно помочь.
Второе решение - позволить приведение A<TYPE> к некоторому нешаблонному типу и переопределить operator<< для этого типа.

См. "55 советов" Мейерса, совет 46.
Abstraction вне форума Ответить с цитированием
Старый 05.03.2013, 18:18   #3
MooNDeaR
В стагнации
Участник клуба
 
Аватар для MooNDeaR
 
Регистрация: 29.07.2011
Сообщений: 1,303
По умолчанию

Решил проблему. Не знаю в чем шутка, но добавил описание шаблона в объявлении дружественной функции и всё заработало:
Код:
#include <iostream>
#include <cstdlib>

#include "Matrix.h"

using namespace std;
using namespace mtx;

template <class TYPE>
class A
{
	template <class TYPE>
	friend ostream& operator<< (ostream&, A<TYPE>&);
};

template <class TYPE>
ostream& operator<< (ostream& out, A<TYPE>& a)
{
	out << 5;
	return out;
}

int main(void)
{
	A<int> a;

	cout << a;

	system("PAUSE");
		
	return 0;
}
E-mail: pashaworking@gmail.com | ICQ: 479914426 | Skype: moondearr
Понять, чего от тебя требует заказчик – это уже половина всей работы, а иногда и полностью выполненное задание.

Последний раз редактировалось MooNDeaR; 05.03.2013 в 20:47.
MooNDeaR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Способы копирования шаблонных таблиц и диаграмм. Cave_IAR Microsoft Office Excel 2 28.10.2012 02:04
2 проблемы в классах. Blad47 Помощь студентам 2 11.04.2011 20:57
макрос вноса данных из шаблонных книг exel v.demin Microsoft Office Excel 10 11.04.2010 19:17
исключительные ситуации в шаблонных классах kedbl4 Общие вопросы C/C++ 15 23.11.2009 17:14
проблемы с оператором Length Picaso18 Паскаль, Turbo Pascal, PascalABC.NET 1 21.01.2009 18:40