Ошибка компилятора 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 () {
}

Ты делаешь Aprivateунаследовать от B когда вы делаете A<B>и это означает, что B::B является private так что вы не можете построить C,

Другие вопросы по тегам