Классы, шаблоны, atl
template<> UINT AFXAPI HashKey<CString*> (CString* key) {
return (NULL == key) ? 0 : HashKey((LPCTSTR)(*key));
}
typedef CString* LPCString;
template<> BOOL AFXAPI CompareElements<LPCString, LPCString> (const LPCString* pElement1, const LPCString* pElement2)
{
if ( *pElement1 == *pElement2 ) {
// true even if pE1==pE2==NULL
return true;
} else if ( NULL != *pElement1 && NULL != *pElement2 ) {
// both are not NULL
//
BOOL bl = IsBadReadPtr((const void*)pElement1,200);
return **pElement1 == **pElement2;
} else {
// either one is NULL
return false;
}
}
Вобщем-то переопределена функция сравнения
И вот эту часть когда, я так понимаю, нужно написать в такой виде:
class CMapStringToATMRecord2 :
public CMap<CString*,CString*,CATMRecord,CATMRecord>
{
public:
template<> UINT AFXAPI HashKey<CString*> (CString* key) {
return (NULL == key) ? 0 : HashKey((LPCTSTR)(*key));
}
typedef CString* LPCString;
template<> BOOL AFXAPI CompareElements<LPCString, LPCString> (const LPCString* pElement1, const LPCString* pElement2)
{
if ( *pElement1 == *pElement2 ) {
// true even if pE1==pE2==NULL
return true;
} else if ( NULL != *pElement1 && NULL != *pElement2 ) {
// both are not NULL
//
BOOL bl = IsBadReadPtr((const void*)pElement1,200);
return **pElement1 == **pElement2;
} else {
// either one is NULL
return false;
}
}
private:
bool isLoaded;
CString *m_mas[10000];
CATMRecord *m_amas[10000];
unsigned int uiCurrent;
public:
void SetAtEx(CString *key, CATMRecord *newValue);
CMapStringToATMRecord2(void);
~CMapStringToATMRecord2(void);
};
Так вот вариант
1. Эти теплэйты оставляю в stdafx.h тогда линковщик выкидыввает ошибку что в объектных файлах такие функции уже есть и ругается сам на себя
2. Если делать шаблоны к классе (я даж не знаю можно ли так) то выдает другую ошибку:
1>d:\mydoc\visual studio 2008\projects\c\atmsstat\atmsstat\mapstringtoshortint2.h(11) : error C2912: explicit specialization; 'UINT CMapStringToShortInt2::HashKey(CString *)' is not a specialization of a function template
1>d:\mydoc\visual studio 2008\projects\c\atmsstat\atmsstat\mapstringtoshortint2.h(30) : error C2912: explicit specialization; 'BOOL CMapStringToShortInt2::CompareElements(const CMapStringToShortInt2::LPCString *,const CMapStringToShortInt2::LPCString *)' is not a specialization of a function template
Объяснения в мсдн я четкого не нашел, а того что было не понял)
Может кто подсказать как изменить шаблоны чтобы они остались работать и не было глобальными а относились только к моему классу? Или как их объявить правильно глобально?
Зачем ты в качестве ключа используешь указатель на CString o_O
Объясни, чего ты вобще хочешь добиться?
Ппочему не используешь стандартные контрейнеры и строку уж и не спрашиваю. )
Код со списками не такой уж большой, точнее большой, но, вобщем-то, достаточно быстро можно Cmap изменить на какую-то другую структуру. Но использовать нужно ассоциативные массивы
Жду советов тогда может какие структуры лучше использовать, какие строки)
Кстати, mfc тут для подключения к базам данных, графики никакой этот mfc не рисует
Читай во второй теме.
Цитата: zxxc
Я когда начинал эту прогу писать ничего не знал ни о каких списках ни о строках толком, вобщем что нашел то и применил)
Код со списками не такой уж большой, точнее большой, но, вобщем-то, достаточно быстро можно Cmap изменить на какую-то другую структуру. Но использовать нужно ассоциативные массивы
Жду советов тогда может какие структуры лучше использовать, какие строки)
Кстати, mfc тут для подключения к базам данных, графики никакой этот mfc не рисует
Код со списками не такой уж большой, точнее большой, но, вобщем-то, достаточно быстро можно Cmap изменить на какую-то другую структуру. Но использовать нужно ассоциативные массивы
Жду советов тогда может какие структуры лучше использовать, какие строки)
Кстати, mfc тут для подключения к базам данных, графики никакой этот mfc не рисует
чем не нравится stl?
std::map<std::string, CMyObject>