46 votes

Héritant d'un constructeur dans une classe template en C++

Pourquoi ne classe D de la compilation, mais la classe C ne l'est pas?

class A
{
    public:
        A(int) {}
};

template <class T>
class B : private T // Note: private base class
{
    public:
       using T::T;
};

class C : public B<A>
{
    public:
        C() : B<A>(123) {}  // Error: 'class A A::A' is inaccessible
};                          //         within this context

using BA = B<A>;

class D : public BA
{
    public:
        D() : BA(123) {}  // OK
};

J'ai testé avec GCC, Clang et Visual C++, et ils sont tous les mêmes. Évolution class B : private T de public T résout le problème. Mais pourquoi? (Notez que l' using T::T est public.)

42voto

Angew Points 53063

Classe A contient de l'injection de la classe nom- A dans son champ d'application (c'est - A::A fait référence à la classe A , sauf si il arrive à se référer au constructeur).

Classe B hérite de ce, de sorte que le nom de l' A dans le champ d'application de l' B se réfère à l'injection de la classe nom- A dans le champ d'application de l' A. Cependant, depuis A est privé de la classe de base de l' B, tous les noms dans le champ d'application de l' A sont privées au sein d' B.

Classe C nouveau hérite de cela, mais il ne peut pas accéder à ce A, puisqu'il est privé dans B. D'où l'erreur. Notez que l'erreur est en fait avec l'aide du nom d' A dans la construction B<A>.

Classe BA n'ont pas ce problème, étant donné que la définition B<A> n'est pas à la portée de toute classe, de sorte que le nom de l' A désigne le nom global A et de ne pas tout injecté de nom de classe. Et bien sûr, le nom de l' BA est public.

Vous pouvez facilement résoudre ce problème en qualifiant le nom de l' A en C:

class C : public B<A>
{
public:
  C() : B<::A>( 123 ) {}
};

Notez que le constructeur de l'héritage n'a pas d'effet. Le problème est l'accès à la classe nom de l' A (injectée en A et hérité B et C), pas d'accès pour le constructeur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X