¿Alguien sabe por qué las declaraciones de uso no parecen funcionar para importar nombres de tipos de clases base dependientes? Funcionan para las variables y funciones de los miembros, pero al menos en GCC 4.3, parecen ignorarse para los tipos.Accediendo a tipos de clases base dependientes
template <class T>
struct Base
{
typedef T value_type;
};
template <class T>
struct Derived : Base<T>
{
// Version 1: error on conforming compilers
value_type get();
// Version 2: OK, but unwieldy for repeated references
typename Base<T>::value_type get();
// Version 3: OK, but unwieldy for many types or deep inheritance
typedef typename Base<T>::value_type value_type;
value_type get();
// Version 4: why doesn't this work?
using typename Base<T>::value_type;
value_type get(); // GCC: `value_type' is not a type
};
que tienen una clase base con un conjunto de typedefs de estilo asignador que me gustaría heredar lo largo de varios niveles de herencia. La mejor solución que he encontrado hasta ahora es la versión 3 anterior, pero tengo curiosidad de por qué la versión 4 no parece funcionar. GCC acepta la declaración de uso, pero parece ignorarla.
He comprobado el C++ Standard, C++ Prog. Lang. 3ª ed. [Stroustrup] y Plantillas C++ [Vandevoorde, Josuttis], pero ninguna parece abordar si las declaraciones de uso se pueden aplicar a tipos de clases base dependientes.
En caso de que ayude ver otro ejemplo, here is the same question being asked, pero no realmente respondido, en la lista de correo de GCC. El asker indica que ha visto 'using typename' en otro lugar, pero que GCC no parece apoyarlo. No tengo otro compilador compatible disponible para probarlo.
Publique un código que debe compilar (en su opinión) para compilar los compiladores, pero no lo hace. Y publica cómo estás usando la plantilla. –
Creo que toda la información relevante está arriba. Las versiones 1-4 funcionan en MSVC 9, que tiene una resolución de nombre de una etapa no conforme (es decir, en tiempo de instanciación). Solo las versiones 2 y 3 funcionan en GCC 4.3. No sé por qué razón la Versión 4 no debería ser válida, pero GCC no la aceptará. En cuanto al uso, realmente no importa cómo se crea una instancia. Solo estoy tratando de compilar la declaración de la plantilla. El código anterior es una simplificación de un adaptador de contenedor mucho más complejo. –
Al publicar código aquí, no espere que las personas tengan que editarlo para compilarlo. –