Частный статический член в базовом классе
#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.
Ответы
Ответ 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
является шаблоном, а элемент статичным.
Тесты:
- шаблонные статические компиляции
- Отсутствует статический шаблон
- шаблон не статический сбой
- Нет шаблона, не статического сбоя