KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I want to bind() to my base class's version of a function from the derived class. The function is marked protected in the base. When I do so, the code compiles happily in Clang (Apple LLVM Compiler 4.1) but gives an error in both g++ 4.7.2 and in Visual Studio 2010. The error is along the lines of: "'Base::foo' : cannot access protected member." The implication is that the context for the reference is actually within bind() , where of course the function is seen as protected. But shouldn't bind() inherit the context of the calling function--in this case, Derived::foo() --and therefore see the base method as accessible? The following program illustrates the issue. 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 ); } }; Why the discrepancy in behavior? Which is correct? What workaround is available for the error-giving compilers?
Tags (comma-separated)
Save Edits
Cancel