Pergunta

Alguém sabe por que usar-declarações não parecem trabalho para importar nomes de tipos de classes de base dependentes? Eles trabalham para variáveis ??e funções de membro, mas pelo menos no GCC 4.3, eles parecem ser ignoradas para tipos.

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
};

Eu tenho uma classe base com um conjunto de typedefs de estilo alocador que eu gostaria de herdar ao longo de vários níveis de herança. A melhor solução que eu encontrei até agora é a versão 3 acima, mas estou curioso porque versão 4 não parece trabalho. GCC aceita a usar-declaração, mas parece ignorá-lo.

Eu verifiquei o padrão C ++, C ++ Prog. Lang. 3a ed. [Stroustrup], e C ++ Modelos [Vandevoorde, Josuttis], mas nenhum parece endereço se pode ser aplicado usando-declarações para tipos de classe base dependentes.

Em caso de ajuda para ver outro exemplo, aqui é o mesma questão que se coloca , mas realmente não respondeu, na lista GCC discussão. O autor da questão indica que ele já viu 'usando typename' em outros lugares, mas que o GCC não parece apoiá-lo. Eu não tenho outro compilador conformidade disponíveis para testá-lo.

Foi útil?

Solução

Como Richard Corden assinala, esta questão foi abordada na C ++ padrão núcleo da linguagem Defeito Relatórios após o padrão de 2003, foi ratificado: Como fazer a palavras-chave typename / template interagem com o uso de-declarações?

resolução proposta (Abril de 2003, revisto em Outubro de 2003):

Adicionar um novo parágrafo ao fundo do 7.3.3 [namespace.udecl]:

Se um usando-declaração usa o palavra-chave typename e especifica um nome dependente (14.7.2 [temp.dep]), o nome introduzido pelo utilizando-declaração é tratado como um typedef-name (7.1.3 [dcl.typedef]).

Este texto não parece figurar na norma Second Edition de 15 outubro de 2003.

GCC não ainda implementar esta resolução, conforme explicado em bug 14258 :

------- O comentário # 3 de Giovanni Bajo 2004-02-27 00:47 [resposta] ------- A problema é que o nosso USING_DECL não gravar o "typename", que é a fato de que é um tipo que é importada através dele. Este utilizado para trabalho graças ao nome do tipo implícito extensão, eu acredito.

bug 21484 indica que 'usando typename' funciona em Comeau e Intel compiladores. Porque MSVC trata todos os nomes como dependente, a construção é desnecessário (mas permitido) para esse compilador.


fixo no GCC 4.7 em 13 de dezembro 2011!

Outras dicas

Você não incluiu um especificador de acesso (público / protegido / privado) no modelo para a base antes de declarar o typedef para Base de Dados :: value_type. Como resultado, o padrão é privado e não é acessível em classes derivadas de Base.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top