与类一起使用时,std::reference_wrapper“没有名为成员”的编译错误

fac*_*054 3 c++ c++11 reference-wrapper

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

'class std::reference_wrapper<testbench>' has no member named 'ownerid'
Run Code Online (Sandbox Code Playgroud)

如果线

    std::reference_wrapper <testbench> camper;
Run Code Online (Sandbox Code Playgroud)

更改为:

    testbench &camper;
Run Code Online (Sandbox Code Playgroud)

然后一切都按照我的预期进行。

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

Ste*_*ell 5

你的理解是错误的。 std::reference_wrapper可以隐式转换为 T& (在您的情况下为测试台),但是当您使用成员访问器 ( test_a.camper.ownerid) 时,它是在 上操作camper,而不是在它所包装的对象上操作。

您可以进行强制转换或使用get成员函数。这未经测试,但我认为它会起作用:

test_a.camper.get().ownerid;
Run Code Online (Sandbox Code Playgroud)