2010-06-10 10 views
6

Así que estoy tratando de conseguir algo de código que se escribe para gcc para compilar en Visual Studio 2008. Tengo un problema que he reducido a esto:¿Por qué esta declaración de la clase no funciona en Visual Studio

class value_t 
{ 
public: 
    typedef std::deque<value_t>   sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

este código falla:

1>cpptest.cpp 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(13) : see reference to class template instantiation 'std::deque<_Ty>' being compiled 
1>  with 
1>  [ 
1>   _Ty=value_t 
1>  ] 
1>c:\program files\microsoft visual studio 9.0\vc\include\deque(518) : error C2027: use of undefined type 'value_t' 
1>  c:\temp\cpptest\cpptest.cpp(10) : see declaration of 'value_t' 

Sin embargo cuando intento esto con std :: vector, que compila bien:

class value_t 
{ 
public: 
    typedef std::vector<value_t>  sequence_t; 
    typedef sequence_t::iterator  iterator; 
}; 

Wh ¿Está mal? He intentado agregar 'typename' en cualquier lugar que se me ocurra, pero en este momento estoy pensando que es solo un error en el Dinkumware STL. ¿Alguien puede explicar lo que está pasando y/u ofrecer una solución? Gracias.

+1

¿"en todas partes se puede pensar en" incluir 'typedef typename sequence_t :: iterator iterator;'? – Stephen

+0

Puede intentar una declaración directa antes de la declaración de clase. es decir, valor de clase_t; –

+0

Bueno, esto siempre sucede, justo después de publicar esta pregunta, encuentro la combinación mágica en google para darme algo relevante. Ver http://www.gamedev.net/community/forums/topic.asp?topic_id=295828 que trata este tema; todavía no ofrece una solución. ¿Alguien puede confirmar que usar deque en esta situación no es estándar? ¿Hay alguna manera de hacer que esto funcione sin cambiar el archivo ? – Roel

Respuesta

7

Su comportamiento indefinido. Ver this enlace en ++ CLC moderado

Recorte de la respuesta de Daniel K: -.

el estándar C++ (tanto en C++ 03 y C++ 0x) dice que lo que está tratando causas no definidas comportamiento, consulte [lib.res.on.functions]/2:

"en particular, los efectos son indefinido en los siguientes casos: [..] - si un tipo incompleto (3.9) es utilizado como un argumento de plantilla cuando instanciando un componente de plantilla. "

+0

Gracias, ese hilo lo explica con el mayor detalle que podría desear. Supongo que tendré que cambiar el código. – Roel

1

Está tratando de usar una clase dentro de sí mismo en una plantilla. ¿Cómo resuelve esto? No sé si alguna vez intenté hacer esto, pero ¿es esto posible? No sé por qué funciona para std :: vector, pero mi suposición es que está mal. Está definiendo una clase y usando esa definición en la definición. Me parece mal. Buena suerte en este caso, voy a estar interesado en ver algunas de las respuestas más profundas a mí mismo ...

+0

Funciona para std :: vector, y en gcc este código también compila bien. Supongo que mientras se conozca sizeof (clase) es suficiente. Hizo tropezar a la gente en el enlace que publiqué en el comentario también, al parecer. He estado haciendo esto con el vector durante años, solo una coincidencia de que funcionó entonces, supongo. – Roel

5

que piensan el problema es que value_t es un tipo incompleto hasta que llegue al final de la definición. Tratar de usar un tipo incompleto como el parámetro de plantilla para un contenedor estándar realmente no se supone que funcione. Puede/funcionará en algunas circunstancias, pero si fallara con todos los tipos de contenedores estándar, eso aún no indicaría ningún tipo de error. El estándar requiere que sea un tipo completo, por lo que si no lo es, obtienes lo que obtienes, probablemente debería fallar constantemente, pero si funciona, no hay nada de malo en eso.

Cuestiones relacionadas