我想bind()
从派生类中获得我的基类版本的函数。该功能在底座中标记为受保护。当我这样做时,代码在 Clang (Apple LLVM Compiler 4.1) 中顺利编译,但在 g++ 4.7.2 和 Visual Studio 2010 中都出现错误。错误类似于:“'Base::foo': cannot访问受保护的成员。”
这意味着引用的上下文实际上是在内部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 );
}
};
为什么行为上的差异?哪个是对的?错误编译器有什么解决方法?