在语句中创建 COM 智能指针时出现错误 C2275 "if"

Error C2275 while creating a COM smart-pointer within "if" statement

本文关键字:错误 C2275 if 指针 语句 创建 COM 智能      更新时间:2023-10-16

为什么我不能

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

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

你能在if语句外声明一个IUnknownPtr类型的简单变量吗?

你能用下面的代码创建一个没有错误的新项目吗?

以下任一项编译正常吗?

if (NULL == (IUnknownPtr ptr = someOtherPtr)) {
}
IUnknownPtr foo;
bool b(foo);

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

operator=应返回IUnknownPtr&(已指定给的对象)_com_ptr_t定义运算符布尔()。您的_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;
}

我记得MSDEV在if语句中声明变量时没有遵循C++规范(或者可能是for循环?)。

它本应该在括号的末尾被销毁,但事实并非如此。

这可能是一种倒退——你试过梳理MSDN档案吗?这似乎更像是一种怪癖,而不是故意的行为,除非(正如另一位海报所评论的)你误解了正在发生的事情。

你能发布实际的代码,并完成周围的功能吗?

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