2011-05-13 18 views
6

que tienen un problema en esta siguiente código:tipo declarado hacia adelante y "de tipo no-clase ya que ha declarado como un tipo de clase"

template <typename T> 
    void foo(struct bar & b); 
    struct bar {}; 
    int main(){} 

Se compila exitosamente en CCG, pero falla en MSVC (2008) con siguiente error:

C2990: 'bar' : non-class type as already been declared as a class type

es el código equivocado o se trata de un error en MSVC?

Funciona si agrego struct bar; antes de la definición de la plantilla.

+1

también falla con VC++ 2010. Y Dios, qué terrible IDE para el desarrollo de C++ VS se ha convertido! –

Respuesta

3

y tenemos nuestro ganador:

https://connect.microsoft.com/VisualStudio/feedback/details/668430/forward-declared-type-and-non-class-type-as-already-been-declared-as-a-class-type

Thank you for reporting this issue. This is indeed a case of non-conformant behaviour in VC++. However, a simple workaround is to reorder the declarations so that the declaration "struct bar" is known when the template declaration is encountered. Due to the low severity of this bug and our priorities, we regret that we cannot fix the bug in the next release of the compiler but we will consider it for a future release.

Regards,

Tanveer Gani Visual C++ Team

0

Es muy probable que tenga struct bar {}; en algún lugar por encima de este bloque de código (posiblemente en un archivo de encabezado). Ver http://msdn.microsoft.com/en-us/library/zfcw8kk9.aspx

Editar: También desde el enlace de arriba:

C2990 can also occur due to a breaking change in the Visual C++ compiler for Visual C++ 2005; the compiler now requires that multiple declarations for the same type be identical with respect to template specification.

Desde foo es de plantilla y bar se está "hacia adelante declararon" en la lista foo argumento, ¿qué ocurre si se mueve struct bar {}; por encima de foo ?

+0

No, este es el código completo y mínimo. –

+0

@Hello Editado base en su comentario. –

+0

Respondiendo a su edición: sí, funcionaría entonces. Además, _ funciona si agrego una barra de estructura; antes de la definición de plantilla. Como he escrito en mi pregunta. –

3

En la mayoría de las situaciones, un compilador C (o C++) funciona estrictamente de arriba hacia abajo en su código fuente. Por lo tanto, necesita un forward declaration antes de intentar hacer referencia al struct bar, de lo contrario, el compilador no sabrá que existe.

+0

Puede hacer una declaración de avance en línea. Como 'void foo (struct bar & b);'. La palabra clave ** struct ** aquí es forward declaration. –

+0

@Hello: ¿En serio? No estoy diciendo que estés equivocado, simplemente que nunca he visto esto antes. Podrías proporcione una referencia? –

+0

@Oli: pruébelo sin la plantilla, se compilará :) :) – Xeo

0

Parece un código válido. Lo que sea que MSVC esté haciendo, parece ser un extraño comportamiento no conforme, por lo que puedo ver.

Cuestiones relacionadas