我为什么不能

if (IUnknownPtr p = anotherComPtr) {} //error C2275: 'IUnknownPtr' : illegal use of this type as an expression

虽然我可以
if (int* a = anotherPointer) {}
IUnknownPtr是通过_COM_SMARTPTR_TYPEDEF(IUnknown, __uuidof(IUnknown))定义的(就像我使用的任何其他智能指针一样)

如何在if语句中创建com smartptr并验证其是否有效?谢谢你。

我使用VS 2008

ps。这不是关于它是否是一种好的编码方式,而是关于error C2275

最佳答案

在下面的小程序中,我无法在vs2008中重现您的编译器错误。您的包含文件,预处理程序定义或编译器选项中可能会有一些不同,从而赋予您不同的行为。

您可以在if语句之外声明IUnknownPtr类型的简单变量吗?

您可以使用以下代码创建新项目,而不会出现错误吗?

以下任何一个编译正常吗?

if (NULL == (IUnknownPtr ptr = someOtherPtr)) {
}

IUnknownPtr foo;
bool b(foo);

该错误表明编译器可以看到IUnknownPtr的定义,但不能将IUnknownPtr的赋值结果解释为 bool 值。

operator =应该返回IUnknownPtr&(已分配给该对象)。 _com_ptr_t定义运算符bool()。您的_COM_SMARTPTR_TYPEDEF是否生成对_com_ptr_t或其他某种类型的引用?您可以通过临时转储预处理器输出(属性/C++/preprocessor/preprocess到文件)来轻松找到。
#include <comdef.h>

int main(int argc, char* argv[])
{
    IUnknownPtr foo;
    IUnknown* foo2 = NULL;

    if (IUnknownPtr foo3 = foo) {
        // do something
    }

    if (IUnknownPtr foo4 = foo2) {
        // do something
    }

    return 0;
}

07-26 00:29