Pergunta

i ter uma base de código antigo aqui, onde eles usaram variáveis ??de membro protegidas. Se este é ou não uma boa ideia pode ser discutido. No entanto, o código deve ter compilado bem com gcc3. Eu tenho um derivado classe de modelo Bar que usos protegida membro x do modelo de classe Foo como assim

template <class Something> class Foo {  
public:  
// stuff...  
protected:  
  some::type x;  
}

template <class Something> Bar : Foo<Something> {
public:
  void cleanup();
}

E na declaração do método de limpeza () não é algo feito com x

template <class Something> void Bar<Something>::cleanup() {
  doSomeThingCleanUpLike (x);
}

Esta não funciona com gcc4, embora deva ter trabalhado com gcc3. Ele funciona quando eu mudar para

doSomeThingCleanUpLike (this->x);

Por que é esse o caso?

Foi útil?

Solução

O x expressão usada na classe derivada é, pelas regras da norma, não dependente de qualquer parâmetro do modelo da classe derivada. Devido a isso, a pesquisa acontece no contexto da definição do modelo e não no ponto de uso / instanciação. Mesmo que a classe base do modelo do modelo parece ser visível, porque é uma classe de modelo a instanciação particular, que pode ser usado pode envolver modelos especializados de modo que a definição do modelo de classe base não pode ser usado para pesquisa de nome.

Ao alterar a expressão para this->x você está tornando-se uma expressão dependente (this em um modelo de classe sempre depende dos parâmetros do modelo). Isto significa que a pesquisa irá ocorrer no contexto instanciação altura em que a classe base é totalmente conhecida e seus membros são visíveis.

Outras dicas

Quando você está definindo o modelo derivada, o compilador só sabe o nome de base modelo de classe, mas não os seus detalhes, então compilador não sabe a classe derivada tem um membro herdado. A fim de informar o compilador da existência do membro, o uso this->, assim como você fez.

Na verdade, é uma duplicata de esta questão .

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