Dlaczego kompilacja klasy D
jest kompilowana, ale klasa C
nie?Dziedziczenie konstruktora z prywatnej klasy szablonów w 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
};
testowałem z GCC, Clang i Visual C++, i wszystkie są takie same. Zmiana class B : private T
na public T
rozwiązuje problem. Ale dlaczego? (Zauważ, że using T::T
jest public
.)
Dodałem znacznik "templates", aby sprawdzić hotshoty. Skieruj wszelkie uwagi krytyczne do "spamowania tagów". – Bathsheba
Jeśli zastąpisz 'B (123)' 'B (123)' kompiluje, a jeśli utworzysz 'C' szablon i użyjesz' B 'wszędzie tam, gdzie również kompiluje. –
Holt
To usprawiedliwiłoby tag szablonu, a nawet wyszukiwanie nazw w szablonach klas jest nieco inne. – MSalters