为什么我不能
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
。
答案 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>
。