【问题标题】:compile error with std::reference_wrapper "has no member named" when used with class与类一起使用时,std::reference_wrapper 编译错误“没有命名成员”
【发布时间】:2018-02-27 03:29:29
【问题描述】:

所以我在 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 作为参考的一般改进?

【问题讨论】:

  • 明确地投射它们。 “没有额外级别的语法间接。必须取消引用指针才能获得指向它们所引用对象的左值;reference_wrappers 有一个隐式 conversion operator 并且可以像它们包装的对象一样调用。” - source.

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


【解决方案1】:

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

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

test_a.camper.get().ownerid;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    • 2012-04-20
    相关资源
    最近更新 更多