在“if”语句中创建COM智能指针时出错C2275

时间:2012-02-14 10:28:47

标签: c++ com smart-pointers

为什么我不能

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

P.S。这不是关于编码的好方法,而是关于error C2275

3 个答案:

答案 0 :(得分:1)

我无法在下面的小程序中重现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 ++ /预处理器/预处理到文件)来轻松找到答案

#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;
}

答案 1 :(得分:0)

当我在if语句中声明一个变量(或者它可能是for循环?)时,我很清楚地记得有关MSDEV不遵循C ++规范的事情。

它应该在方括号的末尾被破坏,但它不是。

这可能是一个回归 - 你试过梳理MSDN档案吗?它似乎更像是一种怪癖而不是故意的行为,除非(如另一张海报评论)你误解了发生的事情。

你能发布实际的代码,还有周围的功能吗?

答案 2 :(得分:0)

由于这对我来说在VS 2010上编译得很好,我假设你可能没有#include <comdef.h>和/或#include <comdefsp.h>