Совет по миграции: ACAD2011\12 в 13\14\15
Этот совет связан не только с ACAD, но и с перспективами Visual Studio и будет полезен всем, кто использует шаблон CMap, где ключом является AcDbHandle&CMap<AcDbHandle, AcDbHandle&, CString, CString> handleMap;
Я недавно получил запрос, когда программист получил сообщение об ошибке C2440: 'typecast' : cannot convert from 'AcDbHandle' to 'long' , хотя этот код прекрасно работает в компиляторе VS 90.0, но дает ошибку в VS 100.0\110.0. После небольшого исследования я обнаружил, что изменился шаблон по-умолчанию
- template<class ARG_KEY>
- AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)
в atlmfc включенном в Afxtempl.h. Новое определения не позволяет преобразование типов, так что у нас есть две возможности: или понять новое определение , с чем я полностью не справился, так что жду мнения экспертов или переопределить шаблон HashKey чтобы он удовлетворял нашим нуждам.
Здесь я следую второму пути – переопределяю шаблон HashKey.
Вы можете поместить следующее определение в вашу функцию DLLMain чтобы предотвратить ошибку преобразования.
- template<>
- AFX_INLINE UINT AFXAPI HashKey<AcDbHandle&>(AcDbHandle& key)
- {
- // Для большинства примитивных значений это работает
- return (DWORD)(((DWORD_PTR)key)>>4);
- }
Приглашаю комментировать это решение, так как я не эксперт в этом вопросе и я лишь учусь вместе с вами
Источник: http://adndevblog.typepad.com/autocad/2014/12/migration-tip-acad201112-to-131415.html
Обсуждение: http://adn-cis.org/forum/index.php?topic=1700
Опубликовано 15.12.2014