Я не могу воспроизвести ошибку вашего компилятора в vs2008 в небольшой программе ниже. Скорее всего, в ваших включаемых файлах, определениях препроцессора или опциях компилятора будет что-то другое, что дает вам другое поведение.
Можете ли вы объявить простую переменную типа IUnknownPtr вне оператора if?
Можете ли вы создать новый проект, используя приведенный ниже код, без ошибки?
В порядке ли какой-либо из следующих компиляторов?
if (NULL == (IUnknownPtr ptr = someOtherPtr)) {
}
IUnknownPtr foo;
bool b(foo);
Ошибка предполагает, что компилятор может видеть определение IUnknownPtr, но не может интерпретировать результат присваивания IUnknownPtr как логическое значение.
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;
}