Acceso a los tipos de clases de base dependientes
-
21-08-2019 - |
Pregunta
¿Alguien sabe por qué el uso-declaraciones no parecen funcionar para importar nombres de los tipos de clases de base dependientes? Trabajan para las variables y funciones miembro, pero al menos en GCC 4.3, parecen ser ignorado para este tipo.
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
};
Tengo 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 por qué no parece Versión 4 a trabajar. GCC acepta el uso de-declaración, pero parece ignorarlo.
He comprobado el estándar C ++, C ++ Prog. Lang. 3ª ed. [BS], y C ++ plantillas [Vandevoorde, Josuttis], pero ninguno parecen abordar si el uso-declaraciones se puede aplicar a los tipos de clase de base dependientes.
En caso de que ayuda a ver otro ejemplo, aquí es el misma pregunta que se hace , pero en realidad no respondió, en la lista de correo GCC. El autor de la pregunta indica que ha visto 'usando nombretipo' en otros lugares, pero eso no parece GCC para apoyarlo. No tengo otro compilador conforme disponibles para probarlo.
Solución
Como Richard Corden señala, esta cuestión se abordó en el C ++ estándar Core idioma Defecto Informes después fue ratificada la norma 2003: ¿Cómo las palabras clave nombretipo / plantilla de interactuar con el uso de declaraciones-?
Propuesta de resolución (abril de 2003, revisado en octubre de 2003):
Añadir un nuevo párrafo a la parte inferior de 7.3.3 [namespace.udecl]:
Si una declaración usando-utiliza el nombretipo palabra clave y especifica una nombre dependiente (14.7.2 [temp.dep]), el nombre introducido por el usando-declaración es tratada como una typedef-name (7.1.3 [dcl.typedef]).
Este texto no parece estar presente en la norma segunda edición del 15 de octubre del 2003.
GCC aún no implementa esta resolución, como se explica en 14258 :
------- comentario # 3 De Giovanni Bajo 2004-02-27 12:47 [respuesta] ------- El nuestro problema es que no lo hace USING_DECL registrar el "nombre de tipo", que es la hecho de que es un tipo que es importada a través de él. Esto funcionaba gracias al nombre del tipo implícito extensión, creo.
error 21484 indica que 'el uso de nombre de tipo' trabaja en Comeau y los compiladores de Intel. Debido a MSVC trata a todos los nombres como dependientes, la construcción es innecesaria (pero permitida) para ese compilador.
fijo en GCC 4.7 el 13 dic 2011
Otros consejos
No ha incluido un modificador de acceso (public / protected / privado) en la plantilla de base antes de declarar el typedef para Base :: value_type. Como resultado, el valor predeterminado es privada y no es accesible en las clases derivadas de la base.