2012-02-14 7 views
5

por qué no puedoerror C2275 al crear un COM-inteligente puntero dentro de "if"

if (IUnknownPtr p = anotherComPtr) {} //error C2275: 'IUnknownPtr' : illegal use of this type as an expression 

mientras pueda

if (int* a = anotherPointer) {} 

IUnknownPtr está definida, throught _COM_SMARTPTR_TYPEDEF(IUnknown, __uuidof(IUnknown)) (como cualesquiera otros punteros inteligentes yo uso)

¿Cómo puedo crear un com smartptr dentro de la declaración if y verificar si es válido o no? Gracias.

Yo uso VS 2008

p.s. No se trata de una buena manera de codificar o no, se trata de error C2275.

+0

Esto es raro. ¿Qué versión de Visual C++ usas? – sharptooth

+0

@sharptooth: VS 2008 – fogbit

+0

¿Por qué no está creando el puntero fuera del if? Y verificar la validez en el si? ¿O es obvio en el contexto COM? (Sin experiencia) – RvdK

Respuesta

0

Recuerdo vagamente algo sobre MSDEV que no sigue las especificaciones de C++ cuando se trata de declarar una variable dentro de una sentencia if (o podría haber sido un ciclo for?).

Debería haber sido destruido al final de los soportes, pero no fue así.

Posiblemente esto sea un retroceso a eso: ¿ha intentado peinar los archivos de MSDN? Parece más un capricho que un comportamiento intencional, a menos que (como comentó otro afiche) haya entendido mal lo que está sucediendo.

¿Se puede publicar el código real, completar con la función circundante?

+1

Está en lo correcto, pero fue la declaración para, y se ha corregido en algún momento (definitivamente se ha solucionado en VS2010). El 'si' debería funcionar. – cvoinescu

+0

Gracias por aclarar – Stefan

0

Como esto me compila muy bien en VS 2010, voy a suponer que tal vez no lo hizo #include <comdef.h> y/o #include <comdefsp.h>.

1

No puedo reproducir el error de compilación en vs2008 en el pequeño programa a continuación. Es probable que exista algo diferente en los archivos de inclusión, las definiciones de preprocesador o las opciones del compilador, lo que le proporciona un comportamiento diferente.

¿Puede declarar una variable simple de tipo IUnknownPtr fuera de una instrucción if?

¿Puede crear un nuevo proyecto utilizando el siguiente código sin el error?

¿Alguno de los siguientes compila OK?

if (NULL == (IUnknownPtr ptr = someOtherPtr)) { 
} 

IUnknownPtr foo; 
bool b(foo); 

El error indica que el compilador puede ver una definición de IUnknownPtr pero no puede interpretar el resultado de la asignación de un IUnknownPtr como un bool.

operator = debe devolver IUnknownPtr & (el objeto al que se ha asignado). _com_ptr_t define operador bool(). ¿Está su _COM_SMARTPTR_TYPEDEF generando referencias a _com_ptr_t o algún otro tipo? Puede encontrarlo fácilmente al eliminar temporalmente la salida del preprocesador (propiedades/C++/preprocesador/preproceso a un archivo)

#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; 
} 
Cuestiones relacionadas