2

我想使用该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 
};
4

1 回答 1

3

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

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

另请注意,在您的const成员函数中,您不需要const_视图,因为m_container它已经是const合格的。您只需要all

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

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

auto all()       { return ranges::view::all(m_container); }
auto all() const { return ranges::view::all(m_container); }   
于 2017-08-12T14:23:07.807 回答