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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.04.2012, 16:00   #1
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию Шаблон в шаблоне или борьба с выделением памяти

Код:
template<typename T>
class TVector {
public:
	T operator[](int nIndex);
	void Add(T *);
	void Add(T);
	void DeleteLast();
	UINT Size() const ;
	void Erase(int nIndex);
	void Erase(int nBegin, int nEnd);

private:
	vector<T>itsItems;
};

class TCustomListBox : public TVector<string> // наследование

TCustomListBox s; // создание
s.Add("stroka"); // добавление
Получаю ошибку:
Цитата:
[ILINK32 Error] Error: Unresolved external 'TVector<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >::Add(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)' referenced from D:\DEVELOPER CENTER\PROGRAMMING LANGUAGES\CPP\PROJECTS\LABS\LABDB\D EBUG\WIN32\MAIN.OBJ
Подскажите, почему возникает эта ошибка?
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 30.04.2012, 16:11   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

а сам метод Add у вас где-нибудь описан?
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 30.04.2012, 16:24   #3
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от Granus Посмотреть сообщение
а сам метод Add у вас где-нибудь описан?
Да, в cpp-файле
Код:
template<typename T>
void TVector<T>::Add(T * TSomeValue) {
	itsItems.push_back(*TSomeValue);
}

template<typename T>
void TVector<T>::Add(T TSomeValue) {
	itsItems.push_back(TSomeValue);
}
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 30.04.2012, 16:33   #4
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Ну не работает раздельная компиляция шаблонов.
Лучше так.
в .h файле вместо
Код:
class TCustomListBox : public TVector<string>
написать просто
Код:
typedef TVector<string> TCustomListBox;
а в cpp реализация методов:
Код:
void TCustomListBox::Add(string x)
{
}
EUGY вне форума Ответить с цитированием
Старый 30.04.2012, 16:44   #5
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Ну не работает раздельная компиляция шаблонов.
Лучше так.
в .h файле вместо
Код:
class TCustomListBox : public TVector<string>
написать просто
Код:
typedef TVector<string> TCustomListBox;
а в cpp реализация методов:
Код:
void TCustomListBox::Add(string x)
{
}
А как тогда дополнять TCustomListBox дополнительными методами? Ведь TVector реализован для многократного использования с разными типами.
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Старый 30.04.2012, 16:51   #6
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Тогда в CPP нужны реализации методов TVector под каждый используемый тип.
Это называется специализацией шаблона.
Код:
template<> void TVector<string>::Add(string)
{

}
Поэтому не разделяй прототип и реализацию, а пиши реализацию шаблона в том же файле .h, тогда скомпилируется, как желаешь.

Последний раз редактировалось EUGY; 30.04.2012 в 16:53.
EUGY вне форума Ответить с цитированием
Старый 30.04.2012, 16:59   #7
t2skler
Форумчанин
 
Аватар для t2skler
 
Регистрация: 25.11.2010
Сообщений: 164
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Тогда в CPP нужны реализации методов TVector под каждый используемый тип.
Это называется специализацией шаблона.
Код:
template<> void TVector<string>::Add(string)
{

}
Поэтому не разделяй прототип и реализацию, а пиши реализацию шаблона в том же файле .h, тогда скомпилируется, как желаешь.
Спасибо за объяснение! +++
Возможно Я Быдлокодер ©.
t2skler вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемы с выделением памяти под BitMap Sasha_M Мультимедиа в Delphi 1 31.10.2011 23:28
Отличие операции с выделением памяти и без Lindemann66 Общие вопросы C/C++ 1 09.08.2011 16:36
Вопрос выделением памяти Tiro Общие вопросы C/C++ 5 13.06.2009 16:46
Проблемы с выделением динамической памяти malloc (recalloc) slips Общие вопросы C/C++ 6 29.04.2009 19:27