У меня есть класс, который выглядит примерно так:
class A
{
public:
void foo(int arg) { foo(arg, false); }
private:
void foo(int arg, bool flag) {}
};
Он построен таким образом, потому что я хочу, чтобы аргумент флага foo
был ложным только при вызове извне A
. Я хочу унаследовать это конфиденциально, но разрешить звонить foo
:
class B : private A
{
public:
using A::foo;
};
Однако это терпит неудачу, потому что объявление использования пытается перенести все перегрузки foo
в область действия, включая частную, которую компилятор справедливо отклоняет.
Это не сложно исправить, я тоже могу:
- Изменить доступность
A::foo(int, bool)
на защищенную или общедоступную
- Наследовать
A
публично;
- Измените имя
A::foo(int, bool)
, чтобы объявление использования не пыталось перенести его в область действия
Это небольшой частный проект, и, кроме того, эта перегрузка вызывается только внутри A
. Так что устранение проблемы здесь не проблема. (Я просто переименую приватную перегрузку.)
Но не похоже, что это необходимо. Почему объявление using пытается перенести недоступные методы в область видимости? Этот конкретный случай просто не охватывается стандартом? Есть ли способ исправить это, кроме методов, которые я перечислил?