使用'using'关键字获取指向类方法的指针

时间:2013-09-03 17:01:27

标签: c++ visual-studio-2010 inheritance

我正在使用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'

4 个答案:

答案 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(); }
};