Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Классы, шаблоны, atl

13K
19 марта 2009 года
zxxc
18 / / 04.05.2006
Вобщем CMap в качестве ключа не поддерживает Cstring, поэтому для него в инете накопался такой кусок кода:
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
Объяснения в мсдн я четкого не нашел, а того что было не понял)
Может кто подсказать как изменить шаблоны чтобы они остались работать и не было глобальными а относились только к моему классу? Или как их объявить правильно глобально?
240
20 марта 2009 года
aks
2.5K / / 14.07.2006
А зачем тебе здесь эта спациализация шаблона? o_O
Зачем ты в качестве ключа используешь указатель на CString o_O
Объясни, чего ты вобще хочешь добиться?

Ппочему не используешь стандартные контрейнеры и строку уж и не спрашиваю. )
13K
20 марта 2009 года
zxxc
18 / / 04.05.2006
Я когда начинал эту прогу писать ничего не знал ни о каких списках ни о строках толком, вобщем что нашел то и применил)
Код со списками не такой уж большой, точнее большой, но, вобщем-то, достаточно быстро можно Cmap изменить на какую-то другую структуру. Но использовать нужно ассоциативные массивы
Жду советов тогда может какие структуры лучше использовать, какие строки)
Кстати, mfc тут для подключения к базам данных, графики никакой этот mfc не рисует
240
20 марта 2009 года
aks
2.5K / / 14.07.2006
Читай во второй теме.
11
20 марта 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: zxxc
Я когда начинал эту прогу писать ничего не знал ни о каких списках ни о строках толком, вобщем что нашел то и применил)
Код со списками не такой уж большой, точнее большой, но, вобщем-то, достаточно быстро можно Cmap изменить на какую-то другую структуру. Но использовать нужно ассоциативные массивы
Жду советов тогда может какие структуры лучше использовать, какие строки)
Кстати, mfc тут для подключения к базам данных, графики никакой этот mfc не рисует


чем не нравится stl?
std::map<std::string, CMyObject>

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог