Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: template - класс для CMap  (Прочитано 7063 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 05-08-2005 10:09 » 

Проблема - мне надо написать свой класс, наследуюший от CMap, причем этот класс должен быть сделан как template - класс.
Пишу:

Код:
#include <afxtempl.h>

template <class T1, class T2, class T3, class T4>
class CMyMap <T1, T2, T3, T4>: public CMap <T1, T2, T3, T4>
{
public:
CMyMap();
virtual ~CMyMap();
const CMyMap& operator=(const CMyMap& myMap);
void GetMsgMap(CMyMap<T1, T2, T3, T4>& myMap);
private:
CMap <T1, T2, T3, T4> m_myMap;
};

[/ode]

При компиляции - куча ошибок, начинающихся с "error C2143: syntax error : missing ';' before '<'" в строке "class CMyMap <..."

Кто может подсказать, в чем проблема? Заранее благодарна.
« Последнее редактирование: 04-12-2007 17:10 от Алексей1153++ » Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 05-08-2005 10:52 » 

Malaja,

убери имена параметров после CMyMap.

template <class T1, class T2, class T3, class T4>
class CMyMap /* ПУСТО! */ : public CMap<T1, T2, T3, T4>
{
// ...
};

Декларация template<...> сама по себе означает, что CMyMap является шаблоном.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 05-08-2005 12:24 » 

npak,

спасибочки! С этим разобралась Ага
Но теперь другая ошибка вылезла Ага:

Есть класс, содержащий в себе переменную типа СMyMap:

Код:
#include "MyMap.h"
class CInfo 
{
private:
     CMyMap<CString, LPCTSTR, short, short> m_mapMsg;
};

При компиляции CInfo.срр получаю:

CInfo.obj : error LNK2001: unresolved external symbol "public: __thiscall CMyMap<class CString,char const *,short,short>::CMyMap<class CString,char const *,short,short>(void)" (??0?$CMyMap@VCString@@PBDFF@@QAE@XZ)
CInfo.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall CMyMap<class CString,char const *,short,short>::~CMyMap<class CString,char const *,short,short>(void)" (??1?$CMyMap@VCString@@PBDFF@@UAE@XZ)
CInfo.obj : error LNK2001: unresolved external symbol "public: class CMyMap<class CString,char const *,short,short> const & __thiscall CMyMap<class CString,char const *,short,short>::operator=(class CMyMap<class CString,char const *,short,s
hort> const &)" (??4?$CMyMap@VCString@@PBDFF@@QAEABV0@ABV0@@Z)
Debug/stl_my.exe : fatal error LNK1120: 3 unresolved externals

И что это такое???
Все три функции определены в MyMap.срр! :

Код:
template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::CMyMap()
{

}

template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::~CMyMap()
{
m_myMap.RemoveAll();
}


template <class T1, class T2, class T3, class T4>
const CMyMap<T1, T2, T3, T4>& CMyMap<T1, T2, T3, T4>::operator=(const CMyMap<T1, T2, T3, T4>& myMap)
{
GetMsgMap(myMap);
return *this;
}

template <class T1, class T2, class T3, class T4>
void CMyMap<T1, T2, T3, T4>::GetMsgMap(CMyMap<T1, T2, T3, T4>& myMap)
{
POSITION pos = m_myMap.GetStartPosition();

while (pos)
{
T1 cstrVal;
T3 nVal = 0;
myMap.GetNextAssoc(pos, cstrVal, nVal);

m_myMap.SetAt(T1(cstrVal), nVal);
}
}
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 05-08-2005 14:30 » 

Ошибка вызвана тем, что линкер не нашёл тела конструктора и деструктора для класса CMyMap<CString, LPCTSTR, short, short>.  Обычно конструкторы и деструкторы генерирует компилятор, но для этого ему надо задать шаблон, по которому строить тела.  Я подозреваю, что определения
Код:
template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::CMyMap()
{

}
ты вынесла в отдельный файл.  Так вот, если ты хочешь, чтобы компилятор смог сгенерировать из них правильные методы, ты должна поместить определения методов в ту же единицу компиляции, в которой они будут использоваться.  Как правило, для этого тела шаблонных методов помещают в тот же самый заголовочный файл, где расположен шаблон класса.

то есть
Код:
template <class T1, class T2, class T3, class T4>
class CMyMap: public CMap <T1, T2, T3, T4>
{
public:
CMyMap() { /* тело метода ! */ }
// ещё надо добавить копирующий конструктор CMyMap(const CMyMap& myMap)
virtual ~CMyMap() { /* тело метода ! */ }
const CMyMap& operator=(const CMyMap& myMap) { /* тело метода ! */ }
void GetMsgMap(CMyMap<T1, T2, T3, T4>& myMap) { /* тело метода ! */ }
private:
CMap <T1, T2, T3, T4> m_myMap;
};
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 05-08-2005 14:49 » 

npak,

Уряяя !!!! Заработало!!! Спасибочки!!! Целую
И еще раз пардон за тупость - я эти вещи практически не использовала в работе, посему и результаты такие   Вот такой я вот
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #5 : 05-08-2005 15:59 » 

мда, рано обрадовалась   Ха-ха-ха

Во-первых, что-то не то с копирующим конструктором - я хотела попасть в него дебагом и поставила break point, а когда стартовала, то этот break point был системой радостно убран в другое место, что обычно означает, что этот код невидим ;-(
Определила я его совершенно нормально:

Код:
CMyMap(const CMyMap<T1, T2, T3, T4>& objMsgInfo);
,,,
template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::CMyMap(const CMyMap<T1, T2, T3, T4>& myMap)
{
GetMsgMap(myMap);
}

Далее - всю эту историю с "class CMyMap : public CMap" я затеяла потому, что у меня есть следующая структура в программе:

класс CMsgShow содержит переменную
Код:
   CMap< short, short, CInfo, CInfo& > m_mapFeMsg;

В свою очередь класс CInfo тоже содержит переменную
Код:
    CMap<CString, LPCSTR, short, short> m_mapMsg;

Соответственно при внесении очередного элемента в m_mapFeMsg необходимо наличие копирующего конструктора или operator= в CMap, что не есть истина  Молчу  Посему я решила переопределить CMap, сделав вокруг него цвой класс CMyMap, в котором уже все это будет (как в Одессе, в которой все есть  Отлично).

Но сделала я что-то точно неверно, а точнее, насколько я понимаю, переменная
Код:
    CMap <T1, T2, T3, T4> m_myMap
в классе CMyMap лишняя. Но тогда возникает вопрос - как же переписать копирующий конструктор или operator=, если у меня нет доступа к переменным базового класса?

Караул! Я уже совсем запуталась! Жаль    Вот такой я вот
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 08-08-2005 09:10 » 

Все, уже поняла - не надо городить огород и перемудривать!  Жжешь
Все сложное просто - в моем классе не надо никаких других функций кроме оператора= и конструктора копирования, остальное будет автоматически вызываться из базового класса.
Т.е. код выглядит так:

Код:

#include <afxtempl.h>


template <class T1, class T2, class T3, class T4>
class CMyMap : public CMap <T1, T2, T3, T4>
{
public:
CMyMap();
CMyMap(const CMyMap<T1, T2, T3, T4>& objMsgInfo);
virtual ~CMyMap();

const CMyMap& operator=(const CMyMap& myMap);
void GetMsgMap(const CMyMap<T1, T2, T3, T4>& myMap);
};

#endif // !defined(AFX_MYMAP_H__3ABD20A6_1C49_492F_9ABA_C39B725CD6F7__INCLUDED_)



template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::CMyMap()
{

}

template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::CMyMap(const CMyMap<T1, T2, T3, T4>& myMap)
{
GetMsgMap(myMap);
}

template <class T1, class T2, class T3, class T4>
CMyMap<T1, T2, T3, T4>::~CMyMap()
{
CMap<T1, T2, T3, T4>::RemoveAll();
}


template <class T1, class T2, class T3, class T4>
const CMyMap<T1, T2, T3, T4>& CMyMap<T1, T2, T3, T4>::operator=(const CMyMap<T1, T2, T3, T4>& myMap)
{
GetMsgMap(myMap);
return *this;
}

template <class T1, class T2, class T3, class T4>
void CMyMap<T1, T2, T3, T4>::GetMsgMap(const CMyMap<T1, T2, T3, T4>& myMap)
{
POSITION pos = myMap.GetStartPosition();

while (pos)
{
T1 cstrVal;
T3 nVal = 0;
myMap.GetNextAssoc(pos, cstrVal, nVal);

CMap<T1, T2, T3, T4>::SetAt(T1(cstrVal), nVal);
}
}


Еще раз всем спасибо!  Все работает!  Улыбаюсь
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 08-08-2005 12:23 » 

Читай страуструпа, это полезно.  Я читал его три раза.  После первого раза я понял, что ничего не понял и мои первые потуги на С++ работали абы как.  Затем я перечитал и увидел, что Страуструп большинство ловушек уже описал, просто я их не понял, пока сам не налетел.  Третий раз я читал уже избранные моменты на пару со стандартом (вроде алгоритма поиска подходящей реализации при перегрузке).

Так что RTFM ! Улыбаюсь
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #8 : 08-08-2005 15:13 » 

npak,

ага  Улыбаюсь
Знаю я это очень забавное состояние, когда понимаешь, что уже ничего не понимаешь  Чтоб непоследняя...
Я этим страдаю периодически - почитываю  Ага Но тут я что-то настолько запуталась, что даже туда не полезла, пока в голове все постепенно не устаканилось, чтобы понять, что я искать собралась.

Еще раз огромное тебе спасибо!
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #9 : 08-08-2005 18:19 » 

Читай страуструпа, это полезно.
Не спорю конечно Улыбаюсь Но (немного оффтоп) я сколько раз не присаживаля за эту книгу, стольо раз и рубило в сон меня неимоверно Улыбаюсь Видать плохо действует она на меня Улыбаюсь Хотя похожие ощущения испытываю и при чтении мсдна Ага
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 09-08-2005 07:28 » 

MOROZ,

Мои ощущения таковы: эту книженцию хорошо читать как справочник - т.е. ты точно знаешь, что ищешь, посему читаешь конкретную тему, когда ты готов к восприятию материала.
А читать ее как обычный учебник - по темам и от корки до корки - по-моему почти невозможно (во всяком случае я не знаю никого, у кого бы это получилось Ага ).
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines