我想bind()
从派生类到我的基类的版本的功能。 该功能被标记为基础的保护。 当我这样做,代码简单地在编译锵(苹果LLVM编译器4.1),但给出了一个错误都G ++ 4.7.2和Visual Studio 2010中的错误是沿着线:“'基地:: 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 );
}
};
为什么行为的差异? 哪个是对的? 什么可行的解决方法的错误,让编译器?