4

我正在使用 Visual Studio 2010。

为什么我不能获得指向在子类中“升级”为公共的类方法的指针?

以下代码无法编译:

#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

4 回答 4

3

它在这里编译。

我认为您只是忘记在编译器中添加 C++11 选项。

例如,对于 gcc,它是-std=c++11or -std=gnu++11

编辑:这里看来,使用别名声明没有在任何 Visual Studio 版本中实现。

实际上,这里有些人谈论编译器错误。

这里奇怪的是:

c.foo();                                                   // this works fine
std::function < void () > f = std::bind(&Child::foo, &c);  // this won't compile
于 2013-09-03T17:10:36.427 回答
1

出于某种原因,Visual Studio 不允许您获取 的地址foo,即使它是Child使用普通旧 C++03 语法声明的公共成员。

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!
于 2013-09-03T22:02:49.643 回答
0

在 c++11 之前,此“使用”允许在以下情况下不隐藏 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(); }
};
于 2013-09-03T17:33:25.827 回答
0

此代码使用g++ 4.8.1. 你在使用 C++11 吗?当我运行它时,我得到以下输出:

Parent::foo()
于 2013-09-03T17:08:08.880 回答