切换 range-v3 的包含标头顺序后编译失败

问题描述 投票:0回答:1

当我在

range-v3 v0.12.0
中同时使用
views::set_intersection
views::transform 时,标题
range/v3/view/set_algorithm.hpp
range/v3/view/transform.hpp
的顺序很重要。如果先包含前一个标头,则代码将无法编译。相反的顺序编译得很好。

这是一个最小的示例:(另请参阅 https://godbolt.org/z/nhK1s3xdv 进行现场演示)

#include <iostream>
#include <map>

// this order fails to compile, however, switch the order, it compiles
#include <range/v3/view/set_algorithm.hpp>
#include <range/v3/view/transform.hpp>

int main () {
    std::map<int, int> m1 {{0, 0}, {1, 1}, {2, 2}};
    std::map<int, int> m2 {{0, 0}, {2, 1}, {3, 2}};
    {
        std::cout << "set_intersection\n";
        auto res = ranges::views::set_intersection(m1, m2);
        for(auto&& p : res) {
            std::cout << p.first << ' ' << p.second << '\n';
        }
    }

    {
        std::cout << "set_intersection\n";
        auto res = m1 | ranges::views::set_intersection(m2);
        for(auto&& p : res) {
            std::cout << p.first << ' ' << p.second << '\n';
        }
    }
    {
        std::cout << "set_intersection and pipe\n";
        auto res = ranges::views::set_intersection(m1, m2)
                     | ranges::views::transform(
                        [](auto&& p) { return 0; });
    }

    return 0;
}

有趣的是,错误消息是

error: use of undeclared identifier 'bind_back'
                return make_view_closure(bind_back(set_intersection_base_fn{},

对于这条线

auto res = m1 | ranges::views::set_intersection(m2);

这与

views::transform
无关。

我搜索了

bind_back
,它是在
meta/meta.hpp
中定义的,并且它已经包含在
view/set_algorithm.hpp
中。

我不明白错误在哪里。请帮忙。谢谢。

c++ c++17 header-files range-v3
1个回答
0
投票

对于模板,包含顺序很重要。 range-v3 是高度模板化的,最好不要偏离要包含的标头的文档。您找到的

bind_back
嵌套在命名空间
meta
中。您需要的
bind_back
bind_back.hpp 中定义,请参阅 range-v3 文档

© www.soinside.com 2019 - 2024. All rights reserved.