我正在使用Visual Studio 2010。
为什么我不能获得指向在子类中“升级”为public的类方法的指针?
以下代码无法编译:
#include <iostream>
#include <functional>
class Parent {
protected:
void foo() {
std::cout << "Parent::foo()\n";
}
};
class Child : public Parent
{
public:
//void foo() { Parent::foo(); } //This compiles
using Parent::foo; //This does NOT compile
};
int main() {
Child c;
std::function < void () > f = std::bind(&Child::foo, &c);
f();
return 0;
}
它给出错误:
error C2248: 'Parent::foo' : cannot access protected member declared in class 'Parent'
答案 0 :(得分:3)
它编译here。
我想你只是忘了在编译器中添加C ++ 11选项。
例如,使用gcc,它是-std=c++11
或-std=gnu++11
。
编辑: here似乎使用别名声明未在任何Visual Studio版本中实现。
事实上,here有些人谈到编译器错误。
这里奇怪的是:
c.foo(); // this works fine
std::function < void () > f = std::bind(&Child::foo, &c); // this won't compile
答案 1 :(得分:1)
出于某种原因,Visual Studio不允许您获取foo
的地址,即使它是使用普通旧C ++ 03语法声明的Child
的公共成员。
std::function<void()> f = std::bind(&Child::foo, &c); // won't compile
auto fp = &Child::foo; // also won't compile
直接调用该函数仍然可以正常工作:
c.foo(); // compiles OK
奇怪的是,这意味着您使用VS2010的部分C ++ 11支持来解决其C ++ 03支持中的缺陷,方法是使用lambda来实现与bind
表达式相同的效果:
std::function<void()> f = [&c]{ c.foo(); }; // compiles OK!
答案 2 :(得分:0)
此代码使用g++ 4.8.1
进行编译。你在使用C ++ 11吗?运行时我得到以下输出:
Parent::foo()
答案 3 :(得分:0)
在pre c ++ 11中, 这个'using'允许在以下情况下不隐藏Parent :: foo:
class Parent
{
protected:
void foo() {}
};
class Child : public Parent
{
using Parent::foo; // without this, following code doesn't compile.
public:
// foo(int) hides Parent::foo without the 'using'
void foo(int) { return foo(); }
};