Malaja
|
|
« : 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
|
|
« Ответ #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 является шаблоном.
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #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; };
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #4 : 05-08-2005 14:49 » |
|
npak, Уряяя !!!! Заработало!!! Спасибочки!!! И еще раз пардон за тупость - я эти вещи практически не использовала в работе, посему и результаты такие
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Malaja
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #7 : 08-08-2005 12:23 » |
|
Читай страуструпа, это полезно. Я читал его три раза. После первого раза я понял, что ничего не понял и мои первые потуги на С++ работали абы как. Затем я перечитал и увидел, что Страуструп большинство ловушек уже описал, просто я их не понял, пока сам не налетел. Третий раз я читал уже избранные моменты на пару со стандартом (вроде алгоритма поиска подходящей реализации при перегрузке). Так что RTFM !
|
|
|
Записан
|
|
|
|
Malaja
|
|
« Ответ #8 : 08-08-2005 15:13 » |
|
npak, ага Знаю я это очень забавное состояние, когда понимаешь, что уже ничего не понимаешь Я этим страдаю периодически - почитываю Но тут я что-то настолько запуталась, что даже туда не полезла, пока в голове все постепенно не устаканилось, чтобы понять, что я искать собралась. Еще раз огромное тебе спасибо!
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
MOPO3
Ай да дэдушка! Вах...
Команда клуба
Offline
Пол:
Холадна аднака!
|
|
« Ответ #9 : 08-08-2005 18:19 » |
|
Читай страуструпа, это полезно. Не спорю конечно Но (немного оффтоп) я сколько раз не присаживаля за эту книгу, стольо раз и рубило в сон меня неимоверно Видать плохо действует она на меня Хотя похожие ощущения испытываю и при чтении мсдна
|
|
|
Записан
|
MCP, MCAD, MCTS:Win, MCTS:Web
|
|
|
Malaja
|
|
« Ответ #10 : 09-08-2005 07:28 » |
|
MOROZ, Мои ощущения таковы: эту книженцию хорошо читать как справочник - т.е. ты точно знаешь, что ищешь, посему читаешь конкретную тему, когда ты готов к восприятию материала. А читать ее как обычный учебник - по темам и от корки до корки - по-моему почти невозможно (во всяком случае я не знаю никого, у кого бы это получилось ).
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
|