Hériter d'un constructeur d'une classe de modèle privée en C ++


Barnett:

Pourquoi la classe Dcompile-t-elle, mais pas la classe C?

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 identiques. Changer class B : private Tpour public Trésoudre le problème. Mais pourquoi? (Notez que le using T::Test public.)

Angew n'est plus fier de SO:

La classe Acontient le nom de la classe injectée Adans sa portée (c'est-à-dire qu'elle fait A::Aréférence à la classe Asauf si elle fait référence au constructeur).

La classe Bhérite de ceci, donc le nom Adans la portée de Bfait référence au nom de classe injecté Adans la portée de A. Cependant, comme Aest une classe de base privée de B, tous les noms dans la portée de Asont privés à l'intérieur B.

La classe Chérite à nouveau de cela, mais elle ne peut pas y accéder A, car elle est privée à l'intérieur B. D'où l'erreur. Notez que l'erreur provient en fait de l'utilisation du nom Adans la construction B<A>.

La classe BAn'a pas ce problème, puisque la définition B<A>n'est dans la portée d'aucune classe, donc le nom Afait référence au nom global Aet non à un nom de classe injecté. Et bien sûr, le nom BAest public.

Vous pouvez facilement résoudre ce problème en qualifiant le nom Aen C:

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

Notez que l'héritage du constructeur n'y a aucun effet. Le problème est avec l'accès au nom de la classeA (injecté Aet hérité dans Bet C), pas avec l'accès au constructeur.

Articles connexes


Accéder à un constructeur privé d'une classe de modèle en C ++

au moins J'ai quelques difficultés à essayer d'accéder à un constructeur privé d'une classe dérivée, qui est spécifiée en tant que paramètre de modèle. J'espérais que la spécification friend Trésoudrait le problème, mais malheureusement, cela n'a aucun effet.

Hériter d'une classe C # qui n'a qu'un constructeur privé

Eero Helenius Je voudrais sous-classer la CompareConstraintclasse XMLUnit.NET dans mon code F #. Cependant, cette classe n'a qu'un seul constructeur privé. Si j'essaye d'en hériter, j'obtiens cette erreur de compilation: This 'inherit' declaration specifies th

Hériter d'un constructeur privé

Amir Kirsh En essayant d'autoriser make_uniqueune classe avec un ctor privé, je suis entré dans l'étrange différence suivante entre deux cas: Cas 1 - cteur vide - compile class A { int _i; A(): _i(7) {} public: template<typename... T> static st