使用std :: reference_wrapper编译错误"没有名为&#34的成员;与课程

时间:2018-02-27 03:29:29

标签: c++ c++11 reference-wrapper

所以我在C ++ 11中发现了这个奇特的东西std::reference_wrapper,我发现它可能在将来的程序开发中很有用。我玩了一会儿,我认为它可以在某些情况下取代旧的参考以便更好地使用,直到我遇到以下错误:

#include <iostream>
#include <functional>

class testbench {
public:
    int ownerid = 5;
    bool camper = false;
};

class testing {
public:
    testing(testbench &x);
    int quack = 3;
    std::reference_wrapper <testbench> camper;
};

testing::testing(testbench &x):camper(x) {
}

int main() {
    testbench tempo;
    testing test_a (tempo);
    std::cout << test_a.camper.ownerid;
}

这会导致gcc出错(我使用Code :: Blocks作为编辑器,gcc作为编译器)

'class std::reference_wrapper<testbench>' has no member named 'ownerid'

如果该行

    std::reference_wrapper <testbench> camper;

更改为:

    testbench &camper;

然后一切都按照我的预期运作。

我如何解决这个问题,或者仅仅是我的误解std::reference_wrapper作为参考的一般改进?

1 个答案:

答案 0 :(得分:3)

你的理解是错误的。 std::reference_wrapper可以隐含地投射到T&amp; (在你的情况下,是testbench)但是当你使用成员访问器(test_a.camper.ownerid)时,它在camper上运行,而不是它包装的对象。

您可以进行演员表或使用get成员函数。这是未经测试的,但我认为它会起作用:

test_a.camper.get().ownerid;