【问题标题】:Can I use CComPtr inside of a std::map?我可以在 std::map 中使用 CComPtr 吗?
【发布时间】:2012-04-29 03:24:12
【问题描述】:

我正在用 C++ 在 Windows COM 中编写一个程序,并且我正在使用 CComPtr 进行智能指针。

我无法找到答案的问题是 - 我可以在 std::map 中使用 CComPtr

我有以下代码片段(简化):

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

我希望维护ints 和IErrorInfo 错误信息之间的映射。

但是我不确定我是否可以执行以下操作:

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

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

我担心result 智能指针的所有权以及当ErrorMap 被销毁时它是否会正确释放?

【问题讨论】:

    标签: c++ windows com atl smart-pointers


    【解决方案1】:

    您需要将您的 CComPtr 包装在 CAdapt 中才能正常工作。

    适配器类 CAdapt 很有用,因为许多容器类 (如 STL 容器类)期望能够获得 使用 address-of 运算符的它们包含的对象的地址。 重新定义地址运算符会混淆这一点 要求,通常会导致编译错误并阻止 对那个容器使用不适应的类型。 CAdapt 提供了一种方法 围绕这些问题。

    【讨论】:

    • 在 C++11 中,您不必这样做,因为 CopyConstructible 要求不再需要 operator &amp; 以正常方式工作。
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 2011-05-16
    • 2021-02-24
    • 2016-01-10
    • 2014-03-10
    • 2018-09-25
    • 2010-12-23
    相关资源
    最近更新 更多