我为什么不能
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;
}