Ошибка компилятора C ++ при частном наследовании - PullRequest
6 голосов
/ 10 февраля 2012

Может кто-нибудь объяснить мне следующую ошибку компилятора:

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 ]

6 голосов
/ 10 февраля 2012

Попробуйте A< ::B> или A<struct B>.

Внутри C безусловные ссылки на B подберут так называемое имя введенного класса , которое передается через базовый класс A. Поскольку A наследуется в частном порядке от B, injected-class-name следует его примеру и также будет частным, поэтому будет недоступен для C.

Еще один день, еще одна странная странность ...

4 голосов
/ 10 февраля 2012

Проблема заключается в экранировании имени структуры 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 () {
}
0 голосов
/ 10 февраля 2012

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

...