Ошибка C2275 при создании смарт-указателя COM в операторе if - PullRequest
5 голосов
/ 14 февраля 2012

Почему я не могу

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)) (как и любые другие умные указатели, которые я использую)

Как я могу создать com smartptr в операторе if и убедиться, что он действителен или нет?Спасибо.

Я использую VS 2008

ps Это не о том, хороший ли это код или нет, речь идет о error C2275.

Ответы [ 3 ]

1 голос
/ 11 апреля 2012

Я не могу воспроизвести ошибку вашего компилятора в 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;
}
0 голосов
/ 20 февраля 2012

Поскольку для VS 2010 это прекрасно скомпилируется, я предполагаю, что, возможно, вы не #include <comdef.h> и / или #include <comdefsp.h>.

0 голосов
/ 20 февраля 2012

Я смутно помню что-то о том, что MSDEV не соответствует спецификациям C ++, когда дело доходит до объявления переменной внутри оператора if (или это мог быть цикл for?).

Он должен был быть разрушен в конце скобок, но это не так.

Возможно, это возврат к прошлому - вы пробовали расчесывать архивы MSDN? Это больше похоже на причуду, чем на преднамеренное поведение, если (как прокомментировал другой автор) вы не поняли, что происходит.

Можете ли вы опубликовать реальный код в комплекте с функцией окружения?

...