2010-07-15 17 views
8

Actualmente estoy trabajando en una clase con una gran cantidad de plantillas y ser capaces de construir tuplas de tuplas haría mucho más fácilC++ 0x: ¿se permiten tuplas de tuplas?

Pero probado este código simple en MSVC++ 2010:

#include <tuple> 

void main() { 
    auto x = std::make_tuple(std::make_tuple(5, true)); 
} 

Y obtengo un error de compilación. El mismo problema ocurre si no uso std :: make_tuple pero directamente std :: tuple's constructor

¿Es un error de MSVC o son tuplas de tuplas no permitidas por el estándar?

Gracias

+0

¿Cuál es el mensaje de error exacto que está recibiendo? –

+0

Es muy muy largo El error inicial es: c: \ logiciels \ visual studio 10.0 \ vc \ include \ tuple (127): error C2440: 'inicializando': no ​​se puede convertir de 'std :: tr1 :: _ Nil' a 'bool' – Tomaka17

+0

Sospecho que la implementación de tuplas de Microsoft es recursiva, pero como Type0 ya es una tupla, colisiona con otra cosa – Tomaka17

Respuesta

4

más puntos de datos:

  • Si utilizamos std::tr1::tuple y estatales explícitamente el tipo de lugar de utilizar auto, a continuación, Visual C++ 2008 compila el código sin error. Intentar compilar el mismo código con Visual C++ 2010 da como resultado el error que está viendo.

  • Si usamos boost::tuple declaramos explícitamente el tipo en lugar de usar auto, entonces Visual C++ 2008 y Visual C++ 2010 compilan el código sin error.

Parece que es probablemente un error de implementación.

3

Has hecho una tupla con un solo miembro --- ¿eso no acaba con el objetivo de las tuplas? De todos modos, sospecho que eso conduce a la ambigüedad.

make_tuple combina la inferencia de tipo con una llamada al constructor tuple. Cuando se llama al constructor tuple con un único argumento que también es tuple, es posible que un constructor de conversión se ajuste mejor que un constructor de envoltura. De ahí el problema.

Se permiten tuplas de tuplas. 1-Tuples podría no serlo