Acesso protegido membro de uma classe em uma classe derivada
-
06-07-2019 - |
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?
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 .