Могу ли я использовать CComPtr внутри std::map?

Я пишу программу в Windows COM на C++ и использую CComPtr для интеллектуальных указателей.

Вопрос, на который я не могу найти ответ: могу ли я использовать CComPtr внутри std::map.

У меня есть следующий фрагмент кода (упрощенный):

std::map<int, CComPtr<IErrorInfo> > ErrorMap;

Я хочу сохранить это сопоставление между ints и IErrorInfo информацией об ошибках.

Однако я не уверен, смогу ли я сделать следующее:

CComPtr<IErrorInfo> result;
GetErrorInfo(0, &pErrInfo);

ErrorMap.insert(std::make_pair(0, result));

Меня беспокоит право собственности на интеллектуальный указатель result и правильно ли он будет освобожден, когда ErrorMap будет уничтожен?


person bodacydo    schedule 17.04.2012    source источник


Ответы (1)


Вам необходимо обернуть CComPtr в CAdapt чтобы это работало.

Класс адаптера CAdapt полезен, поскольку многие классы-контейнеры (например, классы-контейнеры STL) предполагают возможность получения адресов содержащихся в них объектов с помощью оператора адреса. Переопределение оператора address-of может нарушить это требование, обычно вызывая ошибки компиляции и препятствуя использованию неадаптированного типа с этим контейнером. CAdapt позволяет обойти эти проблемы.

person Steve Townsend    schedule 17.04.2012
comment
В C++11 вам не нужно этого делать, поскольку требование CopyConstructible больше не требует, чтобы operator & работал в обычном режиме. - person Alan Stokes; 17.04.2012