Подтвердить что ты не робот

Частный статический член в базовом классе

#include <iostream>
#include <string>

class Base
{
    static std::string s;
};

template<typename T>
class Derived
    : Base
{
public:
    Derived()
    {
        std::cout << s << std::endl;
    }
};

std::string Base::s = "some_text";    

int main()
{
    Derived<int> obj;
}

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

Если класс Derived не является шаблоном, компилятор жалуется на доступ к частной переменной.

[[email protected] c++]$ g++ --version
g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-3)
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
4b9b3361

Ответ 1

Это определенно ошибка GCC, эквивалентная Ошибка GCC 58740:

class A {
    static int p;
};
int A::p = 0;
template<int=0>
struct B : A {
    B() {(void)p;}
};
int main() {
    B<>();
}

Ошибка все еще открыта, и этот код все еще компилируется на 5.1. У GCC есть проблемы с доступом к членству в шаблонах, это просто еще один такой пример.

Ответ 2

Я думаю, что это ошибка компилятора, поскольку это компилируется с gcc, но не clang, для меня.

Изменить: в качестве дополнительной точки данных эта ошибка, похоже, не была исправлена, так как я могу воспроизвести в gcc 4.9.2 и 5.1.

Ответ 3

Это ошибка в g++ 4.8.4. Код компилируется, только если Derived является шаблоном, а элемент статичным.

Тесты:

  • шаблонные статические компиляции
  • Отсутствует статический шаблон
  • шаблон не статический сбой
  • Нет шаблона, не статического сбоя