编译 range-v3 const 方法时出现编译器错误
Compiler error when compiling range-v3 const method
我想使用 range-v3
库来提供对 class 的容器成员的访问。应该有一个可变的以及 const
访问。
然而,编译下面的 class 会导致编译器错误。如果我注释掉 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
};
您想直接使用视图的名称,而不是它们的底层实现细节。视图的名称分别为all
和const_
:
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); }
我想使用 range-v3
库来提供对 class 的容器成员的访问。应该有一个可变的以及 const
访问。
然而,编译下面的 class 会导致编译器错误。如果我注释掉 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
};
您想直接使用视图的名称,而不是它们的底层实现细节。视图的名称分别为all
和const_
:
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); }