Это определенно выглядит как ошибка, поскольку независимо от того, является ли это экземпляром шаблонной функции или реальной функцией, она не должна иметь никакого отношения к доступности закрытых членов в базовом классе.Если вы измените свой код на:
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
.Если они do по-разному оценивают его действительность, они сообщат вам об этом.
И, когда вы do сообщите об ошибке, я быпредложите использовать абсолютный минималистский пример, который работает, им будет намного легче отлаживать.Я получил это до:
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
Так что, если это действительно a gcc
проблема, я бы подумал, что есть некоторое взаимодействие между static
и шаблонами, которое вызывает проблему.