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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2013, 16:23   #1
Любопытный человек
Пользователь
 
Регистрация: 14.01.2012
Сообщений: 39
По умолчанию Перегрузка шаблонного operator<< и определение в cpp

Доброго времени суток.
Честно обшарил интернет, проблему решить не удалось.
Есть header:
Код:
template<class Type> class A;
template<class Type> A<Type> &operator<<(A<Type> &temp, Type val);

template<class Type>
class A
{
	Type data;

public:
	A() { }
	friend A &operator<< <Type>(A &obj, Type val);
};
Если здесь же вместо объявления operator<< определить его и перед friend добавить
Код:
template<class StateType>
, то все работает. Но если в cpp добавим:

Код:
template<class F> A<F> &operator<<(A<F> &temp, F val)
{
	return temp;
}
, то получаем
Код:
error LNK2019: ссылка на неразрешенный внешний символ...
Как сделать определение в cpp-файле?
Любопытный человек вне форума Ответить с цитированием
Старый 24.07.2013, 16:33   #2
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Лучше всего - ни как. Объявление и определение шаблона должны быть в одной единице компиляции.

Если всё же очень хочется использовать .cpp, можно почитать у Вандевурда про модель разделения. (Вандевурд, Джосаттис - "Шаблоны C++")
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...
sVasilich вне форума Ответить с цитированием
Старый 24.07.2013, 16:35   #3
Любопытный человек
Пользователь
 
Регистрация: 14.01.2012
Сообщений: 39
По умолчанию

Благодарю!
Любопытный человек вне форума Ответить с цитированием
Старый 24.07.2013, 16:36   #4
Shad0wF1rst
Форумчанин
 
Регистрация: 11.01.2013
Сообщений: 149
По умолчанию

Цитата:
Сообщение от Любопытный человек Посмотреть сообщение
Доброго времени суток.
Честно обшарил интернет, проблему решить не удалось.
Есть header:
Код:
template<class Type> class A;
template<class Type> A<Type> &operator<<(A<Type> &temp, Type val);

template<class Type>
class A
{
	Type data;

public:
	A() { }
	friend A &operator<< <Type>(A &obj, Type val);
};
Если здесь же вместо объявления operator<< определить его и перед friend добавить
Код:
template<class StateType>
, то все работает. Но если в cpp добавим:

Код:
template<class F> A<F> &operator<<(A<F> &temp, F val)
{
	return temp;
}
, то получаем
Код:
error LNK2019: ссылка на неразрешенный внешний символ...
Как сделать определение в cpp-файле?
Я спотыкался на этих граблях, хотя проблемы тут нет. Все дело в том что с шаблонами можно работать ТОЛЬКО в хидорниках. Не совсем правильно выразился, объявление шаблонов только в хидоре.
Может это и чушь, но это моя чушь и я ее никому не отдам.

Последний раз редактировалось Shad0wF1rst; 24.07.2013 в 16:46.
Shad0wF1rst вне форума Ответить с цитированием
Старый 24.07.2013, 19:11   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

[удалил - чето я перегрелся]

Последний раз редактировалось rrrFer; 24.07.2013 в 19:13.
rrrFer вне форума Ответить с цитированием
Старый 24.07.2013, 19:22   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в cpp поидее можно вынести определенные специализации шаблонов, иначе нет.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка вывода шаблонного класса ACE Valery Общие вопросы C/C++ 8 18.03.2013 14:58
C++ Builder Перегрузка оператора = с ошибкой Could not find a match for 'operator Vector2D::=(const Vector2D)' kolobuch Помощь студентам 0 16.04.2012 22:39
перегрузка & operator+= prc Общие вопросы C/C++ 2 24.03.2011 17:51
Перегрузка operator [] XuMuK Общие вопросы C/C++ 2 22.02.2011 13:12
С++ перегрузка операций для шаблонного класса TIN Помощь студентам 7 29.03.2009 15:24