Может быть и проще, но как я написал в первом посте — я только учусь, и хотелось бы
в дальнейшем использовать шаблоны. Ваша идея с параметром мне сразу пришла, но хотелось
бы воспользоватся новым для себя инструментом — шаблонами.
Что касается сабжа — все решилось включением процедур в h файл.
ps — следующий раз буду юзать поиск внимательнее — я смотрю что каждая 3я тема примерно с текстом поиска
"Шаблон" дает примерно мой вопрос
Добрый день!
В шаблонах как и в STL делаю первые шаги, потому прошу не судить строго.
Пытаюсь создать класс (чтобы не писать одинаковых два). Разница в том что в одном классе уникальность должна соблюдатся по
полю url класса UrlContainer, во втором по parent.
В литературе по С++ примеры с шаблонами очень скудны, потому прошу помощи — как сделать класс-шаблон такой.
Набросок есть, но он не компилируется.
class UrlContainer {
public:
string url;
string parent;
bool used;
};
class SortCriterionByUrl {
public:
bool operator() (const UrlContainer& u1, const UrlContainer& u2) const {
return u1.url < u2.url;
}
};
class SortCriterionByParent {
public:
bool operator() (const UrlContainer& u1, const UrlContainer& u2) const {
return u1.parent < u2.parent;
}
};
template< class T >
class CUrlContainer {
public:
CUrlContainer();
~CUrlContainer();
enum alloc_method{
only_alloc,
alloc_and_cute,
};
enum delete_method{
by_parent,
by_url
};
bool Init();
bool add(const string& url,const string& parent);
bool pop(string &url);
void del(delete_method dm,const string& s);
bool alloc_all(string& s,alloc_method am);
bool alloc_all(CMem& mem,alloc_method am);
void saveLines(LPCVOID lpMem,DWORD dwSize);
void saveLines(const string& s);
size_t count();
void clear();
private:
CLock lock;
set<UrlContainer,T> m_set;
protected:
};
// Все функции не привожу, т.к. они однообразныtemplate < class T >
CUrlContainer<T>::CUrlContainer(){
}
template < class T >
CUrlContainer<T>::~CUrlContainer(){
}
template < class T >
bool CUrlContainer<T>::add(const string& url,const string& parent){
bool ret = false;
if( lock.Lock() ){
UrlContainer url_cont;
url_cont.url = url;
url_cont.used = false;
url_cont.parent = parent;
pair< set<UrlContainer,T>::iterator,bool > status = m_set.insert(url_cont);
ret = status.second;
lock.Unlock();
}
return ret;
}
И собственно как я пытаюсь объявлять и использовать класс
Здравствуйте, Socket, Вы писали:
S>очень хочется понять в чем я не прав
Обычно очень хочется видеть полный минимальный пример, и описание проблемы.
Рискну предположить, что проблема в строке
pair< set<UrlContainer,T>::iterator,bool > status = m_set.insert(url_cont);
Если я прав, то проблема в том, что компилятор не может решить, что такое set<UrlContainer,T>::iterator — то ли это тип, то ли статическая переменная-член, то ли еще что-то.
Нужно просто немного помочь компилятору, указав ему, что set<UrlContainer,T>::iterator является типом:
pair< typenameset<UrlContainer,T>::iterator,bool > status = m_set.insert(url_cont);
Здравствуйте, Socket, Вы писали:
S>Здравствуйте, Bell, Вы писали:
S>С ошибками компиляции разобрался более-менее, теперь ошибка линкера возникает S>не могу понять что не так
Если коротко: определение шаблона должно лежать в заголовке. Всё целиком.
За подробностями обратись в поиск — эта тема обсуждается очень часто.
Здравствуйте, Socket, Вы писали:
S>Здравствуйте, Bell, Вы писали:
S>С ошибками компиляции разобрался более-менее, теперь ошибка линкера возникает S>не могу понять что не так...
.
Вместо того, чтобы выносить определение шаблона в заголовок, можно в конце cpp-файла добавить две следующие строчки:
template class CUrlContainer<UrlContainer>;
template class CUrlContainer<SortCriterionByUrl>;
Это явные запросы на инстанцирование шаблона CUrlContainer с парпметрами UrlContainer и SortCriterionByUrl. При такой реализации шаблоном CUrlContainer можно будет пользоваться только для типов UrlContainer и SortCriterionByUrl. При попытке использования с любым другом типом будут возникать ошибки линковки.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, Socket, Вы писали:
S>Здравствуйте, Bell, Вы писали:
S>С ошибками компиляции разобрался более-менее, теперь ошибка линкера возникает S>не могу понять что не так
Определения шаблонов функций (в т.ч. функций-членов шаблонов классов) должны быть в .h