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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top