Я хочу bind()
перейти к моей базовой версии функции из производного класса. Функция отмечена как защищенная в базе. Когда я это делаю, код успешно компилируется в Clang (Apple LLVM Compiler 4.1), но дает ошибку как в g++ 4.7.2, так и в Visual Studio 2010. Ошибка в строках: "Base:: foo": не может доступ к защищенному члену. "
Подразумевается, что контекст ссылки действительно находится в пределах bind()
, где, конечно, функция рассматривается как защищенная. Но не следует ли bind()
наследовать контекст вызывающей функции - в этом случае Derived::foo()
- и, следовательно, видеть базовый метод как доступный?
Следующая проблема иллюстрирует проблему.
struct Base
{
protected: virtual void foo() {}
};
struct Derived : public Base
{
protected:
virtual void foo() override
{
Base::foo(); // Legal
auto fn = std::bind( &Derived::foo,
std::placeholders::_1 ); // Legal but unwanted.
fn( this );
auto fn2 = std::bind( &Base::foo,
std::placeholders::_1 ); // ILLEGAL in G++ 4.7.2 and VS2010.
fn2( this );
}
};
Почему расхождение в поведении? Что правильно? Какое обходное решение доступно для компиляторов с ошибкой?