Ошибка компилятора C++ при частном наследовании
Может кто-нибудь объяснить мне следующую ошибку компилятора:
struct B
{
};
template <typename T>
struct A : private T
{
};
struct C : public A<B>
{
C(A<B>); // ERROR HERE
};
Ошибка в указанной строке:
test.cpp:2:1: error: 'struct B B::B' is inaccessible
test.cpp:12:7: error: within this context
Что именно недоступно и почему?
3 ответа
Решение
Пытаться A< ::B>
или же A<struct B>
,
Внутри C
безоговорочные ссылки на B
подхватит так называемое injected-class-name, оно заносится через базовый класс A
, поскольку A
наследуется в частном порядке от B
, имя введенного класса следует за ним и также будет частным, поэтому будет недоступно для C
,
Еще один день, еще одна странная странность...
Проблема заключается в экранировании имен структуры B . Проверьте это:
struct B{};
struct X{};
template <class T>
struct A : private T
{};
struct C : public A<B>
{
C(){
A<X> t1; // WORKS
// A<B> t2; // WRONG
A< ::B> t3; // WORKS
}
};
int main () {
}
Ты делаешь A
private
унаследовать от B
когда вы делаете A<B>
и это означает, что B::B
является private
так что вы не можете построить C
,