Estoy portando mi código de Windows de C++ (msvc & intel) a Linux (g ++). El código usa muchas plantillas (me gusta la metaprogramación ;-). Pero no puedo compilar este código:problema de plantilla de g ++
template <class TA>
struct A
{
template <class TAB> struct B;
};
template <class TC>
struct C {};
template <class TD>
struct D
{
template <class TTD> class T {};
};
template<class TA>
template<class TBA>
struct A<TA>::B : C<typename D<TA>::T<TBA> >
{
int foo;
};
g ++ me dice que en la definición de A :: B, clase C tiene argumentos de plantilla no válidos. ¡Pero en msvc e intel funciona bien! ¿Cuál es el problema aquí? PD: Lo siento, no puedo publicar el código original, porque es demasiado complicado. Pero este ejemplo es prácticamente el mismo y da el mismo error en g ++. Gracias.
ACTUALIZACIÓN: he encontrado que el problema está en el argumento TBA de T. g ++ no me gusta el uso de la segunda plantilla en la definición.
que he visto que "la plantilla plantilla struct ..." sintaxis antes, pero nunca he sabe lo que significa o por qué es sintaxis legal. ¿Qué significa (cuando se menciona "plantilla" dos veces delante de una estructura así)? –
Dennis
@Dennis: es necesario para la definición de plantillas anidadas fuera de la plantilla adjunta, consulte p. Ej. [aquí] (http://www.comeaucomputing.com/techtalk/templates/#outsidedef). –
TA es un argumento de plantilla de A, y TAB es un argumento de plantilla de A :: B – f0b0s