ADN Open CIS
Сообщество программистов Autodesk в СНГ

15/12/2014

Совет по миграции: 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. После небольшого исследования я обнаружил, что изменился шаблон по-умолчанию

Код - C++: [Выделить]
  1. template<class ARG_KEY>
  2. AFX_INLINE UINT AFXAPI HashKey(ARG_KEY key)

в atlmfc включенном в Afxtempl.h. Новое определения не позволяет преобразование типов, так что у нас есть две возможности: или понять новое определение , с чем я полностью не справился, так что жду мнения экспертов или переопределить шаблон HashKey чтобы он удовлетворял нашим нуждам.

Здесь я следую второму пути – переопределяю шаблон HashKey.

Вы можете поместить следующее определение в вашу функцию DLLMain чтобы предотвратить ошибку преобразования.

Код - C++: [Выделить]
  1. template<>
  2. AFX_INLINE UINT AFXAPI HashKey<AcDbHandle&>(AcDbHandle& key)
  3. {
  4.   // Для большинства примитивных значений это работает
  5.   return (DWORD)(((DWORD_PTR)key)>>4);
  6. }

Приглашаю комментировать это решение, так как я не эксперт в этом вопросе и я лишь учусь вместе с вами

Источник: 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