【问题标题】:Compiler error when compiling range-v3 const method编译 range-v3 const 方法时出现编译器错误
【发布时间】:2017-08-12 14:12:25
【问题描述】:

我想使用range-v3 库来提供对类的容器成员的访问。应该有一个可变的以及const 访问。 然而,编译下面的类会导致编译器错误。如果我将const 方法注释掉,编译器就没有什么可抱怨的了:

error: no match for ‘operator|’ (operand types are ‘const std::vector<SomeType> {aka const std::vector<SomeType, std::allocator<SomeType> >}’ and ‘ranges::v3::view::const_fn’)

这里有什么问题?

class A
{
public:
    auto all() {
        return m_container
                | ranges::view::all_fn();
    }

    const auto all() const {
        return m_container
                | ranges::view::const_fn();
    }

private:
 std::vector<SomeType> m_container 
};

【问题讨论】:

    标签: c++ c++17 range-v3


    【解决方案1】:

    您想直接使用视图的名称,而不是它们的底层实现细节。视图的名称分别为allconst_

    auto all()       { return m_container | ranges::view::all; }
    auto all() const { return m_container | ranges::view::const_; }
    

    还要注意,在您的const 成员函数中,您不需要const_ 视图,因为m_container 已经是const-qualified。你只需要all:

    auto all()       { return m_container | ranges::view::all; }
    auto all() const { return m_container | ranges::view::all; }
    

    或者,正如Casey 建议的那样,以正常方式做事更直接和可读:

    auto all()       { return ranges::view::all(m_container); }
    auto all() const { return ranges::view::all(m_container); }   
    

    【讨论】:

    • 我认为return ranges::view::all(m_container); 在这种情况下比使用管道运算符更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多