Warum kompiliert Klasse D
, Klasse C
nicht?Vererbung eines Konstruktors aus einer privaten Schablonenklasse in 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
};
ich mit GCC getestet, Clang und Visual C++, und sie sind alle gleich. Das Ändern class B : private T
zu public T
löst das Problem. Aber warum? (Beachten Sie, dass die using T::T
ist public
.)
Ich habe das "templates" -Tag hinzugefügt, um die Hotshots zu kontaktieren. Bitte richten Sie Kritik an "Tag Spamming" an mich. – Bathsheba
Wenn Sie "B (123)" durch 'B (123)' ersetzen, kompiliert es, und wenn Sie 'C' templated machen und' B 'verwenden, kompiliert es auch. –
Holt
Das würde das Template-Tag rechtfertigen, und in der Tat unterscheidet sich die Namenssuche in Klassenvorlagen subtil. – MSalters