Ответ 1
Это определенно выглядит как ошибка, так как не является ли эта функция экземпляра шаблона или реальной функцией не доступной для доступа частных членов в базовом классе. Если вы измените свой код на:
int bar(int&) {
return PRIVATE;
}
то он справедливо жалуется:
testprog.cpp: In member function 'int Derived::bar(int&)':
testprog.cpp:3:26: error: 'constexpr const int Base::PRIVATE' is private
static constexpr int PRIVATE = 1;
^
testprog.cpp:9:16: error: within this context
return PRIVATE;
^
Я бы просто поднял это как ошибку на gcc
. Если у них есть другое представление о ее действительности, они сообщают вам об этом.
И, когда вы делаете файл с ошибкой, я бы предложил использовать пример абсолютного минимализма, который работает, это облегчит их отладку. Я получил это до:
class Base {
static constexpr int PRIVATE = 42;
};
struct Derived : public Base {
template <class T> int bar(T) {
return PRIVATE;
}
};
int main() {
Derived d;
return d.bar(1);
}
Вы также можете указать различные возможности для объявления PRIVATE
и их влияния на gcc
и clang
(сундуки с этого вопроса):
gcc clang
-------- --------
static constexpr int accepted rejected
static const int accepted rejected
const int rejected rejected
int rejected rejected
Вместо использования функции без шаблонов (как указано выше):
int bar(int) {
return PRIVATE;
}
похоже, приводит к тому, что gcc
"ведет себя":
gcc clang
-------- --------
static constexpr int rejected rejected
static const int rejected rejected
const int rejected rejected
int rejected rejected
Итак, если это действительно проблема gcc
, я бы подумал, что существует некоторое взаимодействие между static
и templates, которое вызывает проблему.