Почему я могу расширить частный вложенный класс классом шаблона? - PullRequest
5 голосов
/ 13 июня 2011

Я столкнулся с некоторой странностью, когда кажется, что шаблонный класс может расширять частный вложенный класс.

Имеется следующий закрытый вложенный класс:

class A {
private:
  class B {
  protected:
    void doSomething() {
      ...
    }
  };
};

Следующее не компилируется, как ожидалось:

class C : public A::B {
public:
  C() {
    this->doSomething();
  }
};

Однако, gcc, похоже, с радостью принимает следующее, которое компилируется без смехов и фактически вызывает метод:

template<typename T>
class C : public A::B {
public:
  C() {
    this->doSomething();
  }
};

Кто-нибудь знает, является ли это ожидаемым поведением при использовании шаблонов или я обнаружил странность в gcc. Я нахожусь на версии 4.4.5 (Ubuntu / Linaro 4.4.4-14ubuntu5), поэтому я понимаю, что немного устарел. Если это ожидаемое поведение, я был бы очень признателен за объяснение (или указатель на объяснение), поскольку это не то, чего я ожидал, и я хотел бы узнать о нем больше.

Большое спасибо, Matt

1 Ответ

7 голосов
/ 13 июня 2011

Это должно быть ошибкой компилятора.Класс недоступен из любого класса, который не является другом из A, включая любое создание шаблона класса.

GCC 4.2.1 и 4.6 принимают этот код

Clang ++ отклоняет его с сообщением об ошибке

error: 'B' is a private member of 'A'
  struct C : A::B {

Comeau отклоняет код с аналогичным сообщением

error: class "A::B" (declared at line 5) is inaccessible
struct C : A::B {
              ^
      detected during instantiation of class "C<T> [with T=int]"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...